summaryrefslogtreecommitdiff
path: root/chef/lib
diff options
context:
space:
mode:
Diffstat (limited to 'chef/lib')
-rw-r--r--chef/lib/chef/knife.rb28
-rw-r--r--chef/lib/chef/knife/client_bulk_delete.rb34
-rw-r--r--chef/lib/chef/provider/package/apt.rb63
3 files changed, 67 insertions, 58 deletions
diff --git a/chef/lib/chef/knife.rb b/chef/lib/chef/knife.rb
index 0279549f12..8cd1920216 100644
--- a/chef/lib/chef/knife.rb
+++ b/chef/lib/chef/knife.rb
@@ -497,34 +497,6 @@ class Chef
self.msg("Deleted #{obj_name}")
end
- def bulk_delete(klass, fancy_name, delete_name=nil, list=nil, regex=nil, &block)
- object_list = list ? list : klass.list(true)
-
- if regex
- to_delete = Hash.new
- object_list.each_key do |object|
- next if regex && object !~ /#{regex}/
- to_delete[object] = object_list[object]
- end
- else
- to_delete = object_list
- end
-
- output(format_list_for_display(to_delete))
-
- confirm("Do you really want to delete the above items")
-
- to_delete.each do |name, object|
- if Kernel.block_given?
- block.call(name, object)
- else
- object.destroy
- end
- output(format_for_display(object)) if config[:print_after]
- self.msg("Deleted #{fancy_name} #{name}")
- end
- end
-
def rest
@rest ||= begin
require 'chef/rest'
diff --git a/chef/lib/chef/knife/client_bulk_delete.rb b/chef/lib/chef/knife/client_bulk_delete.rb
index 1a2b3bfa97..8bf2c2f116 100644
--- a/chef/lib/chef/knife/client_bulk_delete.rb
+++ b/chef/lib/chef/knife/client_bulk_delete.rb
@@ -6,9 +6,9 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -29,12 +29,34 @@ class Chef
banner "knife client bulk delete REGEX (options)"
- def run
- if @name_args.length < 1
+ def run
+ if name_args.length < 1
ui.fatal("You must supply a regular expression to match the results against")
exit 42
- else
- bulk_delete(Chef::ApiClient, "client", nil, nil, @name_args[0])
+ end
+ all_clients = Chef::ApiClient.list(true)
+
+ matcher = /#{name_args[0]}/
+ clients_to_delete = {}
+ all_clients.each do |name, client|
+ next unless name =~ matcher
+ clients_to_delete[client.name] = client
+ end
+
+ if clients_to_delete.empty?
+ ui.info "No clients match the expression /#{name_args[0]}/"
+ exit 0
+ end
+
+ ui.msg("The following clients will be deleted:")
+ ui.msg("")
+ ui.msg(ui.list(clients_to_delete.keys.sort, :columns_down))
+ ui.msg("")
+ ui.confirm("Are you sure you want to delete these clients")
+
+ clients_to_delete.sort.each do |name, client|
+ client.destroy
+ ui.msg("Deleted client #{name}")
end
end
end
diff --git a/chef/lib/chef/provider/package/apt.rb b/chef/lib/chef/provider/package/apt.rb
index 5f7ff0d204..44bb0f158e 100644
--- a/chef/lib/chef/provider/package/apt.rb
+++ b/chef/lib/chef/provider/package/apt.rb
@@ -25,44 +25,57 @@ class Chef
class Package
class Apt < Chef::Provider::Package
+ include Chef::Mixin::ShellOut
+ attr_accessor :virtual
+
def load_current_resource
@current_resource = Chef::Resource::Package.new(@new_resource.name)
@current_resource.package_name(@new_resource.package_name)
+ check_package_state(@new_resource.package_name)
+ @current_resource
+ end
+
+ def check_package_state(package)
+ Chef::Log.debug("Checking package status for #{package}")
+ installed = false
+ depends = false
- Chef::Log.debug("#{@new_resource} checking apt-cache policy")
- status = popen4("apt-cache policy #{@new_resource.package_name}") do |pid, stdin, stdout, stderr|
- stdout.each do |line|
- case line
- when /^\s{2}Installed: (.+)$/
- installed_version = $1
- if installed_version == '(none)'
- Chef::Log.debug("#{@new_resource} current version is nil")
- @current_resource.version(nil)
- else
- Chef::Log.debug("#{@new_resource} current version is #{installed_version}")
- @current_resource.version(installed_version)
- end
- when /^\s{2}Candidate: (.+)$/
- Chef::Log.debug("#{@new_resource} candidate version is #{$1}")
- @candidate_version = $1
+ shell_out!("aptitude show #{package}").stdout.each_line do |line|
+ case line
+ when /^State: installed/
+ installed = true
+ when /^Version: (.*)/
+ @candidate_version = $1
+ if installed
+ @current_resource.version($1)
+ else
+ @current_resource.version(nil)
end
+ when /Depends: ([^\s]*) /
+ depends = $1
+ when /Provided by: ([\w\d\-\.]*)/
+ next if installed
+ virtual_provider = $1
+ virtual_provider = depends if depends
+ Chef::Log.debug("Virtual package provided by #{virtual_provider}")
+ @virtual = true
+ installed = check_package_state(virtual_provider)
+ @candidate_version = virtual_provider
end
end
- unless status.exitstatus == 0
- raise Chef::Exceptions::Package, "apt-cache failed - #{status.inspect}!"
- end
-
- if @candidate_version == "(none)"
+ if @candidate_version.nil?
raise Chef::Exceptions::Package, "apt does not have a version of package #{@new_resource.package_name}"
end
- @current_resource
+ return installed
end
def install_package(name, version)
+ package_name = "#{name}=#{version}"
+ package_name = "#{name} #{@candidate_version}" if @virtual
run_command_with_systems_locale(
- :command => "apt-get -q -y#{expand_options(@new_resource.options)} install #{name}=#{version}",
+ :command => "apt-get -q -y#{expand_options(@new_resource.options)} install #{package_name}",
:environment => {
"DEBIAN_FRONTEND" => "noninteractive"
}
@@ -74,8 +87,10 @@ class Chef
end
def remove_package(name, version)
+ package_name = "#{name}"
+ package_name = "#{name} #{@candidate_version}" if @virtual
run_command_with_systems_locale(
- :command => "apt-get -q -y#{expand_options(@new_resource.options)} remove #{@new_resource.package_name}",
+ :command => "apt-get -q -y#{expand_options(@new_resource.options)} remove #{package_name}",
:environment => {
"DEBIAN_FRONTEND" => "noninteractive"
}