diff options
Diffstat (limited to 'chef/lib')
-rw-r--r-- | chef/lib/chef/knife.rb | 28 | ||||
-rw-r--r-- | chef/lib/chef/knife/client_bulk_delete.rb | 34 | ||||
-rw-r--r-- | chef/lib/chef/provider/package/apt.rb | 63 |
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" } |