Chef & FreeBSD : use pkgng
Baptiste Daroussin did an incredible job on FreeBSD with the new packages system, named PkgNG. It brings modern workflow, options and shiny features that were needed for a long time. Say goodbye to painfully long upgrades.
However, Chef is not yet able to use this packaging system as it does not have a PkgNG provider, or not had. This is a hacky way to do so but here is a way to use PkgNG with chef, making it the default provider for your packages.
require 'chef/mixin/shell_out'
require 'chef/platform'
require 'chef'
include Chef::Mixin::ShellOut
class Chef
class Provider
class Package
class Pkgng < Chef::Provider::Package
def initialize(*args)
super
@current_resource = Chef::Resource::Package.new(@new_resource.name)
@current_resource.package_name(@new_resource.package_name)
@current_resource
end
def check_package_state
pkg_info = shell_out!("pkg info #{package_name}", :env => nil, :returns => [0,70])
version = nil
t = pkg_info.stdout.match(/(.*)-(\d+\.\d+\.\d+(\.\d+.*\s)?)\s+(.*)/)
unless t.nil?
version = t[2].strip
end
return version
end
def load_current_resource
@current_resource.package_name(@new_resource.package_name)
@current_resource.version(self.check_package_state())
@candidate_version = ""
end
def package_name
@new_resource.package_name
end
def install_package(name, version = "")
shell_out!("pkg install -y #{package_name}", :env => nil).status
Chef::Log.debug("PKGNG : #{@new_resource} installed from: #{@new_resource.source}")
end
def remove_package(name, version = nil)
shell_out!("pkg delete -y #{package_name}", :env => nil).status
end
end
end
end
end
Chef::Platform.set({
:platform => :freebsd,
:resource => :package,
:provider => Chef::Provider::Package::Pkgng
})