chef 0.10.2 → 0.10.4.rc.1
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.
- data/distro/common/html/chef-client.8.html +4 -4
- data/distro/common/html/knife-cookbook.1.html +5 -3
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/man/man1/knife-cookbook.1 +5 -1
- data/distro/common/man/man1/knife-node.1 +1 -1
- data/distro/common/markdown/man1/knife-cookbook-site.mkd +3 -3
- data/distro/common/markdown/man1/knife-cookbook.mkd +7 -0
- data/distro/common/markdown/man1/knife-node.mkd +4 -3
- data/distro/common/markdown/man1/knife-ssh.mkd +2 -0
- data/lib/chef/application.rb +1 -0
- data/lib/chef/cookbook_loader.rb +18 -0
- data/lib/chef/cookbook_uploader.rb +1 -1
- data/lib/chef/data_bag.rb +14 -2
- data/lib/chef/data_bag_item.rb +8 -2
- data/lib/chef/encrypted_data_bag_item.rb +19 -6
- data/lib/chef/environment.rb +12 -6
- data/lib/chef/exceptions.rb +1 -0
- data/lib/chef/knife.rb +0 -28
- data/lib/chef/knife/bootstrap.rb +7 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +14 -12
- data/lib/chef/knife/bootstrap/centos5-gems.erb +8 -5
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +16 -9
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -3
- data/lib/chef/knife/client_bulk_delete.rb +28 -6
- data/lib/chef/knife/cookbook_site_install.rb +2 -2
- data/lib/chef/knife/cookbook_upload.rb +71 -0
- data/lib/chef/knife/core/bootstrap_context.rb +13 -3
- data/lib/chef/knife/core/cookbook_scm_repo.rb +2 -3
- data/lib/chef/knife/core/node_presenter.rb +5 -2
- data/lib/chef/knife/help.rb +13 -12
- data/lib/chef/knife/help_topics.rb +4 -0
- data/lib/chef/knife/ssh.rb +25 -4
- data/lib/chef/mixin/create_path.rb +3 -2
- data/lib/chef/mixin/get_source_from_package.rb +42 -0
- data/lib/chef/mixin/language.rb +8 -11
- data/lib/chef/monkey_patches/numeric.rb +9 -1
- data/lib/chef/monkey_patches/string.rb +21 -0
- data/lib/chef/platform.rb +2 -1
- data/lib/chef/provider.rb +1 -1
- data/lib/chef/provider/git.rb +16 -3
- data/lib/chef/provider/group/suse.rb +53 -0
- data/lib/chef/provider/mount/mount.rb +28 -20
- data/lib/chef/provider/package/apt.rb +39 -24
- data/lib/chef/provider/package/dpkg.rb +5 -2
- data/lib/chef/provider/package/easy_install.rb +2 -2
- data/lib/chef/provider/package/freebsd.rb +5 -2
- data/lib/chef/provider/package/macports.rb +4 -4
- data/lib/chef/provider/package/rpm.rb +4 -1
- data/lib/chef/provider/package/rubygems.rb +3 -0
- data/lib/chef/provider/package/solaris.rb +3 -0
- data/lib/chef/provider/package/yum-dump.py +239 -81
- data/lib/chef/provider/package/yum.rb +977 -110
- data/lib/chef/provider/package/zypper.rb +20 -3
- data/lib/chef/provider/remote_directory.rb +0 -1
- data/lib/chef/provider/service/arch.rb +35 -28
- data/lib/chef/provider/service/systemd.rb +102 -0
- data/lib/chef/provider/service/upstart.rb +8 -2
- data/lib/chef/providers.rb +2 -0
- data/lib/chef/resource.rb +31 -2
- data/lib/chef/resource/git.rb +9 -0
- data/lib/chef/resource/mount.rb +1 -2
- data/lib/chef/resource/yum_package.rb +20 -0
- data/lib/chef/rest.rb +1 -1
- data/lib/chef/role.rb +1 -1
- data/lib/chef/run_context.rb +3 -3
- data/lib/chef/runner.rb +15 -2
- data/lib/chef/shell_out.rb +1 -1
- data/lib/chef/shell_out/windows.rb +2 -2
- data/lib/chef/solr_query.rb +1 -1
- data/lib/chef/tasks/chef_repo.rake +1 -1
- data/lib/chef/version.rb +1 -1
- metadata +425 -441
@@ -35,8 +35,9 @@ class Chef
|
|
35
35
|
|
36
36
|
if file_path.kind_of?(String)
|
37
37
|
file_path = File.expand_path(file_path).split(File::SEPARATOR)
|
38
|
-
file_path.shift if file_path[0]
|
39
|
-
|
38
|
+
file_path.shift if file_path[0] == ''
|
39
|
+
# Check if path starts with a separator or drive letter (Windows)
|
40
|
+
unless file_path[0].match("^#{File::SEPARATOR}|^[a-zA-Z]:")
|
40
41
|
file_path[0] = "#{File::SEPARATOR}#{file_path[0]}"
|
41
42
|
end
|
42
43
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Author:: Lamont Granquist (<lamont@opscode.com>)
|
2
|
+
# Copyright:: Copyright (c) 2008 Opscode, 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
|
+
|
19
|
+
#
|
20
|
+
# mixin to make this syntax work without specifying a source:
|
21
|
+
#
|
22
|
+
# gem_pacakge "/tmp/foo-x.y.z.gem"
|
23
|
+
# rpm_package "/tmp/foo-x.y-z.rpm"
|
24
|
+
# dpkg_package "/tmp/foo-x.y.z.deb"
|
25
|
+
#
|
26
|
+
|
27
|
+
class Chef
|
28
|
+
module Mixin
|
29
|
+
module GetSourceFromPackage
|
30
|
+
def initialize(new_resource, run_context)
|
31
|
+
super
|
32
|
+
# if we're passed something that looks like a filesystem path, with no source, use it
|
33
|
+
# - require at least one '/' in the path to avoid gem_package "foo" breaking if a file named 'foo' exists in the cwd
|
34
|
+
if new_resource.source.nil? && new_resource.package_name.match(/#{::File::SEPARATOR}/) && ::File.exists?(new_resource.package_name)
|
35
|
+
Chef::Log.debug("No package source specified, but #{new_resource.package_name} exists on the filesystem, copying to package source")
|
36
|
+
new_resource.source(@new_resource.package_name)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
data/lib/chef/mixin/language.rb
CHANGED
@@ -69,24 +69,21 @@ class Chef
|
|
69
69
|
@values["default"] = value
|
70
70
|
else
|
71
71
|
assert_valid_platform_values!(platforms, value)
|
72
|
-
Array(platforms).each { |platform| @values[platform.to_s] =
|
72
|
+
Array(platforms).each { |platform| @values[platform.to_s] = normalize_keys(value)}
|
73
73
|
value
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
Array(values).each {|value| flatter_array << value }
|
85
|
-
flatter_array
|
77
|
+
def normalize_keys(hash)
|
78
|
+
hash.inject({}) do |h, key_value|
|
79
|
+
keys, value = *key_value
|
80
|
+
Array(keys).each do |key|
|
81
|
+
h[key.to_s] = value
|
82
|
+
end
|
83
|
+
h
|
86
84
|
end
|
87
85
|
end
|
88
86
|
|
89
|
-
|
90
87
|
def assert_valid_platform_values!(platforms, value)
|
91
88
|
unless value.kind_of?(Hash)
|
92
89
|
msg = "platform dependent values must be specified in the format :platform => {:version => value} "
|
@@ -21,8 +21,29 @@
|
|
21
21
|
# give the actual number of characters. In Chef::REST, we need the bytesize
|
22
22
|
# so we can correctly set the Content-Length headers, but ruby 1.8.6 and lower
|
23
23
|
# don't define String#bytesize. Monkey patching time!
|
24
|
+
|
25
|
+
begin
|
26
|
+
require 'enumerator'
|
27
|
+
rescue LoadError
|
28
|
+
end
|
29
|
+
|
24
30
|
class String
|
25
31
|
unless method_defined?(:bytesize)
|
26
32
|
alias :bytesize :size
|
27
33
|
end
|
34
|
+
|
35
|
+
unless method_defined?(:lines)
|
36
|
+
def lines
|
37
|
+
enum_for(:each)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# <= 1.8.6 needs some ord!
|
43
|
+
class String
|
44
|
+
unless method_defined?(:ord)
|
45
|
+
def ord
|
46
|
+
self.unpack('c').first
|
47
|
+
end
|
48
|
+
end
|
28
49
|
end
|
data/lib/chef/platform.rb
CHANGED
@@ -126,7 +126,8 @@ class Chef
|
|
126
126
|
:default => {
|
127
127
|
:service => Chef::Provider::Service::Redhat,
|
128
128
|
:cron => Chef::Provider::Cron,
|
129
|
-
:package => Chef::Provider::Package::Zypper
|
129
|
+
:package => Chef::Provider::Package::Zypper,
|
130
|
+
:group => Chef::Provider::Group::Suse
|
130
131
|
}
|
131
132
|
},
|
132
133
|
:redhat => {
|
data/lib/chef/provider.rb
CHANGED
@@ -81,7 +81,7 @@ class Chef
|
|
81
81
|
class << self
|
82
82
|
include Chef::Mixin::ConvertToClassName
|
83
83
|
|
84
|
-
def build_from_file(cookbook_name, filename)
|
84
|
+
def build_from_file(cookbook_name, filename, run_context)
|
85
85
|
pname = filename_to_qualified_string(cookbook_name, filename)
|
86
86
|
|
87
87
|
# Add log entry if we override an existing light-weight provider.
|
data/lib/chef/provider/git.rb
CHANGED
@@ -38,10 +38,11 @@ class Chef
|
|
38
38
|
def action_checkout
|
39
39
|
assert_target_directory_valid!
|
40
40
|
|
41
|
-
if
|
41
|
+
if target_dir_non_existent_or_empty?
|
42
42
|
clone
|
43
43
|
checkout
|
44
44
|
enable_submodules
|
45
|
+
add_remotes
|
45
46
|
@new_resource.updated_by_last_action(true)
|
46
47
|
else
|
47
48
|
Chef::Log.debug "#{@new_resource} checkout destination #{@new_resource.destination} already exists or is a non-empty directory"
|
@@ -66,7 +67,7 @@ class Chef
|
|
66
67
|
Chef::Log.info "#{@new_resource} updated to revision #{target_revision}"
|
67
68
|
@new_resource.updated_by_last_action(true)
|
68
69
|
end
|
69
|
-
|
70
|
+
add_remotes
|
70
71
|
else
|
71
72
|
action_checkout
|
72
73
|
@new_resource.updated_by_last_action(true)
|
@@ -85,7 +86,7 @@ class Chef
|
|
85
86
|
::File.exist?(::File.join(@new_resource.destination, ".git"))
|
86
87
|
end
|
87
88
|
|
88
|
-
def
|
89
|
+
def target_dir_non_existent_or_empty?
|
89
90
|
!::File.exist?(@new_resource.destination) || Dir.entries(@new_resource.destination).sort == ['.','..']
|
90
91
|
end
|
91
92
|
|
@@ -98,6 +99,18 @@ class Chef
|
|
98
99
|
sha_hash?(result) ? result : nil
|
99
100
|
end
|
100
101
|
|
102
|
+
def add_remotes
|
103
|
+
if (@new_resource.additional_remotes.length > 0)
|
104
|
+
@new_resource.additional_remotes.each_pair do |remote_name, remote_url|
|
105
|
+
Chef::Log.info "#{@new_resource} adding git remote #{remote_name} = #{remote_url}"
|
106
|
+
command = "git remote add #{remote_name} #{remote_url}"
|
107
|
+
if shell_out(command, run_options(:cwd => @new_resource.destination, :command_log_level => :info)).exitstatus != 0
|
108
|
+
@new_resource.updated_by_last_action(true)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
101
114
|
def clone
|
102
115
|
remote = @new_resource.remote
|
103
116
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# Author:: AJ Christensen (<aj@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/group/groupadd'
|
20
|
+
require 'chef/mixin/shell_out'
|
21
|
+
|
22
|
+
class Chef
|
23
|
+
class Provider
|
24
|
+
class Group
|
25
|
+
class Suse < Chef::Provider::Group::Groupadd
|
26
|
+
|
27
|
+
include Chef::Mixin::ShellOut
|
28
|
+
|
29
|
+
def load_current_resource
|
30
|
+
super
|
31
|
+
|
32
|
+
raise Chef::Exceptions::Group, "Could not find binary /usr/sbin/groupmod for #{@new_resource}" unless ::File.exists?("/usr/sbin/groupmod")
|
33
|
+
end
|
34
|
+
|
35
|
+
def modify_group_members
|
36
|
+
unless @new_resource.members.empty?
|
37
|
+
if(@new_resource.append)
|
38
|
+
@new_resource.members.each do |member|
|
39
|
+
Chef::Log.debug("#{@new_resource} appending member #{member} to group #{@new_resource.group_name}")
|
40
|
+
shell_out!("groupmod -A #{member} #{@new_resource.group_name}")
|
41
|
+
end
|
42
|
+
else
|
43
|
+
Chef::Log.debug("#{@new_resource} setting group members to #{@new_resource.members.join(', ')}")
|
44
|
+
shell_out!("groupmod -A #{@new_resource.members.join(',')} #{@new_resource.group_name}")
|
45
|
+
end
|
46
|
+
else
|
47
|
+
Chef::Log.debug("#{@new_resource} not changing group members, the group has no members")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -36,29 +36,21 @@ class Chef
|
|
36
36
|
@current_resource = Chef::Resource::Mount.new(@new_resource.name)
|
37
37
|
@current_resource.mount_point(@new_resource.mount_point)
|
38
38
|
@current_resource.device(@new_resource.device)
|
39
|
-
|
40
|
-
|
39
|
+
mounted?
|
40
|
+
enabled?
|
41
|
+
end
|
42
|
+
|
43
|
+
def mountable?
|
41
44
|
# only check for existence of non-remote devices
|
42
45
|
if (device_should_exist? && !::File.exists?(device_real) )
|
43
46
|
raise Chef::Exceptions::Mount, "Device #{@new_resource.device} does not exist"
|
44
47
|
elsif( !::File.exists?(@new_resource.mount_point) )
|
45
48
|
raise Chef::Exceptions::Mount, "Mount point #{@new_resource.mount_point} does not exist"
|
46
49
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
case line
|
52
|
-
when /^#{device_mount_regex}\s+on\s+#{Regexp.escape(@new_resource.mount_point)}/
|
53
|
-
mounted = true
|
54
|
-
Chef::Log.debug("Special device #{device_logstring} mounted as #{@new_resource.mount_point}")
|
55
|
-
when /^([\/\w])+\son\s#{Regexp.escape(@new_resource.mount_point)}\s+/
|
56
|
-
mounted = false
|
57
|
-
Chef::Log.debug("Special device #{$~[1]} mounted as #{@new_resource.mount_point}")
|
58
|
-
end
|
59
|
-
end
|
60
|
-
@current_resource.mounted(mounted)
|
61
|
-
|
50
|
+
return true
|
51
|
+
end
|
52
|
+
|
53
|
+
def enabled?
|
62
54
|
# Check to see if there is a entry in /etc/fstab. Last entry for a volume wins.
|
63
55
|
enabled = false
|
64
56
|
::File.foreach("/etc/fstab") do |line|
|
@@ -72,16 +64,33 @@ class Chef
|
|
72
64
|
@current_resource.dump($3.to_i)
|
73
65
|
@current_resource.pass($4.to_i)
|
74
66
|
Chef::Log.debug("Found mount #{device_fstab} to #{@new_resource.mount_point} in /etc/fstab")
|
75
|
-
|
67
|
+
next
|
68
|
+
when /^[\/\w]+\s+#{Regexp.escape(@new_resource.mount_point)}\s+/
|
76
69
|
enabled = false
|
77
70
|
Chef::Log.debug("Found conflicting mount point #{@new_resource.mount_point} in /etc/fstab")
|
78
71
|
end
|
79
72
|
end
|
80
73
|
@current_resource.enabled(enabled)
|
81
74
|
end
|
75
|
+
|
76
|
+
def mounted?
|
77
|
+
mounted = false
|
78
|
+
shell_out!("mount").stdout.each_line do |line|
|
79
|
+
case line
|
80
|
+
when /^#{device_mount_regex}\s+on\s+#{Regexp.escape(@new_resource.mount_point)}/
|
81
|
+
mounted = true
|
82
|
+
Chef::Log.debug("Special device #{device_logstring} mounted as #{@new_resource.mount_point}")
|
83
|
+
when /^([\/\w])+\son\s#{Regexp.escape(@new_resource.mount_point)}\s+/
|
84
|
+
mounted = false
|
85
|
+
Chef::Log.debug("Special device #{$~[1]} mounted as #{@new_resource.mount_point}")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
@current_resource.mounted(mounted)
|
89
|
+
end
|
82
90
|
|
83
91
|
def mount_fs
|
84
92
|
unless @current_resource.mounted
|
93
|
+
mountable?
|
85
94
|
command = "mount -t #{@new_resource.fstype}"
|
86
95
|
command << " -o #{@new_resource.options.join(',')}" unless @new_resource.options.nil? || @new_resource.options.empty?
|
87
96
|
command << case @new_resource.device_type
|
@@ -112,7 +121,6 @@ class Chef
|
|
112
121
|
def remount_fs
|
113
122
|
if @current_resource.mounted and @new_resource.supports[:remount]
|
114
123
|
shell_out!("mount -o remount #{@new_resource.mount_point}")
|
115
|
-
|
116
124
|
@new_resource.updated_by_last_action(true)
|
117
125
|
Chef::Log.debug("#{@new_resource} is remounted at #{@new_resource.mount_point}")
|
118
126
|
elsif @current_resource.mounted
|
@@ -165,7 +173,7 @@ class Chef
|
|
165
173
|
end
|
166
174
|
|
167
175
|
def device_should_exist?
|
168
|
-
@new_resource.device !~ /:/ && @new_resource.device !~ /\/\// && @new_resource.device != "tmpfs"
|
176
|
+
@new_resource.device !~ /:/ && @new_resource.device !~ /\/\// && @new_resource.device != "tmpfs" && @new_resource.fstype != 'fuse'
|
169
177
|
end
|
170
178
|
|
171
179
|
private
|
@@ -25,44 +25,57 @@ class Chef
|
|
25
25
|
class Package
|
26
26
|
class Apt < Chef::Provider::Package
|
27
27
|
|
28
|
+
include Chef::Mixin::ShellOut
|
29
|
+
attr_accessor :virtual
|
30
|
+
|
28
31
|
def load_current_resource
|
29
32
|
@current_resource = Chef::Resource::Package.new(@new_resource.name)
|
30
33
|
@current_resource.package_name(@new_resource.package_name)
|
34
|
+
check_package_state(@new_resource.package_name)
|
35
|
+
@current_resource
|
36
|
+
end
|
37
|
+
|
38
|
+
def check_package_state(package)
|
39
|
+
Chef::Log.debug("Checking package status for #{package}")
|
40
|
+
installed = false
|
41
|
+
depends = false
|
31
42
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
Chef::Log.debug("#{@new_resource} current version is #{installed_version}")
|
43
|
-
@current_resource.version(installed_version)
|
44
|
-
end
|
45
|
-
when /^\s{2}Candidate: (.+)$/
|
46
|
-
Chef::Log.debug("#{@new_resource} candidate version is #{$1}")
|
47
|
-
@candidate_version = $1
|
43
|
+
shell_out!("aptitude show #{package}").stdout.each_line do |line|
|
44
|
+
case line
|
45
|
+
when /^State: installed/
|
46
|
+
installed = true
|
47
|
+
when /^Version: (.*)/
|
48
|
+
@candidate_version = $1
|
49
|
+
if installed
|
50
|
+
@current_resource.version($1)
|
51
|
+
else
|
52
|
+
@current_resource.version(nil)
|
48
53
|
end
|
54
|
+
when /Depends: ([^\s]*) /
|
55
|
+
depends = $1
|
56
|
+
when /Provided by: ([\w\d\-\.]*)/
|
57
|
+
next if installed
|
58
|
+
virtual_provider = $1
|
59
|
+
virtual_provider = depends if depends
|
60
|
+
Chef::Log.debug("Virtual package provided by #{virtual_provider}")
|
61
|
+
@virtual = true
|
62
|
+
installed = check_package_state(virtual_provider)
|
63
|
+
@candidate_version = virtual_provider
|
49
64
|
end
|
50
65
|
end
|
51
66
|
|
52
|
-
|
53
|
-
raise Chef::Exceptions::Package, "apt-cache failed - #{status.inspect}!"
|
54
|
-
end
|
55
|
-
|
56
|
-
if @candidate_version == "(none)"
|
67
|
+
if @candidate_version.nil?
|
57
68
|
raise Chef::Exceptions::Package, "apt does not have a version of package #{@new_resource.package_name}"
|
58
69
|
end
|
59
70
|
|
60
|
-
|
71
|
+
return installed
|
61
72
|
end
|
62
73
|
|
63
74
|
def install_package(name, version)
|
75
|
+
package_name = "#{name}=#{version}"
|
76
|
+
package_name = "#{name} #{@candidate_version}" if @virtual
|
64
77
|
run_command_with_systems_locale(
|
65
|
-
:command => "apt-get -q -y#{expand_options(@new_resource.options)} install #{
|
78
|
+
:command => "apt-get -q -y#{expand_options(@new_resource.options)} install #{package_name}",
|
66
79
|
:environment => {
|
67
80
|
"DEBIAN_FRONTEND" => "noninteractive"
|
68
81
|
}
|
@@ -74,8 +87,10 @@ class Chef
|
|
74
87
|
end
|
75
88
|
|
76
89
|
def remove_package(name, version)
|
90
|
+
package_name = "#{name}"
|
91
|
+
package_name = "#{name} #{@candidate_version}" if @virtual
|
77
92
|
run_command_with_systems_locale(
|
78
|
-
:command => "apt-get -q -y#{expand_options(@new_resource.options)} remove #{
|
93
|
+
:command => "apt-get -q -y#{expand_options(@new_resource.options)} remove #{package_name}",
|
79
94
|
:environment => {
|
80
95
|
"DEBIAN_FRONTEND" => "noninteractive"
|
81
96
|
}
|
@@ -19,15 +19,18 @@
|
|
19
19
|
require 'chef/provider/package'
|
20
20
|
require 'chef/mixin/command'
|
21
21
|
require 'chef/resource/package'
|
22
|
+
require 'chef/mixin/get_source_from_package'
|
22
23
|
|
23
24
|
class Chef
|
24
25
|
class Provider
|
25
26
|
class Package
|
26
27
|
class Dpkg < Chef::Provider::Package::Apt
|
27
|
-
DPKG_INFO = /([a-z\d\-\+]+)\t([\w\d
|
28
|
+
DPKG_INFO = /([a-z\d\-\+]+)\t([\w\d.~-]+)/
|
28
29
|
DPKG_INSTALLED = /^Status: install ok installed/
|
29
30
|
DPKG_VERSION = /^Version: (.+)$/
|
30
|
-
|
31
|
+
|
32
|
+
include Chef::Mixin::GetSourceFromPackage
|
33
|
+
|
31
34
|
def load_current_resource
|
32
35
|
@current_resource = Chef::Resource::Package.new(@new_resource.name)
|
33
36
|
@current_resource.package_name(@new_resource.package_name)
|