From 93567aef4a376b97d2dc71a0e6eb14a96b201a6e Mon Sep 17 00:00:00 2001 From: Martin Seener Date: Fri, 5 Sep 2014 10:14:08 +0200 Subject: [PATCH] apt::force: Added 2 parameters for automatic configuration file handling; fixes #modules-1306 when updating or installing newer packages with apt::force and you have changed previous configuration files aptitude or apt-get will prompt what to do. You can suppress that by pre-define the action with cfg_files parameter (new, old or unchanged and its backward compatible if not defined). With a second optional parameter cfg_missing you can force your provider to install missing configuration files as well. Signed-off-by: Martin Seener apt::force: Changed selectors used in force.pp to case statements; refs #module-1306 Signed-off-by: Martin Seener apt::force: rspec: fixed the failing tests and added validate_re for cfg_files and validate_bool for cfg_missing. Also removed default values for both case statements and only allow pre-defined values or true/false. Furthermore enhanced the README refs #module-1306 Was able to fix the failing rspec tests for the patch. Thanks to Morgan Haskel. Signed-off-by: Martin Seener Despite the puppetlabs-stdlib documentation says validation_re supports 3 arguments the tests failed telling that only 2 are supported. Fixed this by removing the 3 optional argument; refs #modules-1306 Signed-off-by: Martin Seener apt::force: updated readme refs #module-1306 Signed-off-by: Martin Seener --- README.md | 14 +++++++-- manifests/force.pp | 25 +++++++++++++--- spec/defines/force_spec.rb | 58 ++++++++++++++++++++++++++++++++++---- 3 files changed, 84 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 7991404..c7938a6 100644 --- a/README.md +++ b/README.md @@ -71,13 +71,21 @@ Installs the build depends of a specified package. ### apt::force Forces a package to be installed from a specific release. This class is particularly useful when using repositories, like Debian, that are unstable in Ubuntu. +The cfg_files parameter controls wether newer or older configuration files should be used or only unchanged configuration files should be updated. Cfg_missing forces the provider to install all missing configuration files. Both are optional. apt::force { 'glusterfs-server': - release => 'unstable', - version => '3.0.3', - require => Apt::Source['debian_unstable'], + release => 'unstable', + version => '3.0.3', + cfg_files => 'unchanged', + cfg_missing => true, + require => Apt::Source['debian_unstable'], } +You can additionally set the following attributes: + + * `cfg_files`: "new", "old", "unchanged" or "none" (default). "new" will overwrite all existing configuration files with newer ones, "old" will force usage of all old files and "unchanged" only updates unchanged config files whereas setting "none" will don't do anything but providing backward-compatability with existing puppet manifests. + * `cfg_missing`: "true" or "false". Setting cfg_missing to false will provide backward compatability whereas setting true will add an aptitude/apt-get parameter which checks and installs missing configuration files for the selected package. + ### apt_key A native Puppet type and provider for managing GPG keys for APT is provided by this module. diff --git a/manifests/force.pp b/manifests/force.pp index 152bb67..a73f7ab 100644 --- a/manifests/force.pp +++ b/manifests/force.pp @@ -2,11 +2,16 @@ # force a package from a specific release define apt::force( - $release = false, - $version = false, - $timeout = 300 + $release = false, + $version = false, + $timeout = 300, + $cfg_files = 'none', + $cfg_missing = false, ) { + validate_re($cfg_files, ['^new', '^old', '^unchanged', '^none']) + validate_bool($cfg_missing) + $provider = $apt::params::provider $version_string = $version ? { @@ -19,6 +24,18 @@ define apt::force( default => "-t ${release}", } + case $cfg_files { + 'new': { $config_files = '-o Dpkg::Options::="--force-confnew"' } + 'old': { $config_files = '-o Dpkg::Options::="--force-confold"' } + 'unchanged': { $config_files = '-o Dpkg::Options::="--force-confdef"' } + 'none': { $config_files = '' } + } + + case $cfg_missing { + true: { $config_missing = '-o Dpkg::Options::="--force-confmiss"' } + false: { $config_missing = '' } + } + if $version == false { if $release == false { $install_check = "/usr/bin/dpkg -s ${name} | grep -q 'Status: install'" @@ -34,7 +51,7 @@ define apt::force( } } - exec { "${provider} -y ${release_string} install ${name}${version_string}": + exec { "${provider} -y ${config_files} ${config_missing} ${release_string} install ${name}${version_string}": unless => $install_check, logoutput => 'on_failure', timeout => $timeout, diff --git a/spec/defines/force_spec.rb b/spec/defines/force_spec.rb index a3a215c..c32c438 100644 --- a/spec/defines/force_spec.rb +++ b/spec/defines/force_spec.rb @@ -11,13 +11,15 @@ describe 'apt::force', :type => :define do let :default_params do { - :release => false, - :version => false + :release => false, + :version => false, + :cfg_files => 'none', + :cfg_missing => false, } end describe "when using default parameters" do - it { should contain_exec("/usr/bin/apt-get -y install #{title}").with( + it { should contain_exec("/usr/bin/apt-get -y install #{title}").with( :unless => "/usr/bin/dpkg -s #{title} | grep -q 'Status: install'", :logoutput => 'on_failure', :timeout => '300' @@ -28,7 +30,7 @@ describe 'apt::force', :type => :define do let :params do default_params.merge(:release => 'testing') end - it { should contain_exec("/usr/bin/apt-get -y -t #{params[:release]} install #{title}").with( + it { should contain_exec("/usr/bin/apt-get -y -t #{params[:release]} install #{title}").with( :unless => "/usr/bin/test \$(/usr/bin/apt-cache policy -t #{params[:release]} #{title} | /bin/grep -E 'Installed|Candidate' | /usr/bin/uniq -s 14 | /usr/bin/wc -l) -eq 1" ) } end @@ -37,11 +39,41 @@ describe 'apt::force', :type => :define do let :params do default_params.merge(:version => '1') end - it { should contain_exec("/usr/bin/apt-get -y install #{title}=#{params[:version]}").with( + it { should contain_exec("/usr/bin/apt-get -y install #{title}=#{params[:version]}").with( :unless => "/usr/bin/dpkg -s #{title} | grep -q 'Version: #{params[:version]}'" ) } end + describe "when specifying cfg_files parameter" do + let :params do + default_params.merge(:cfg_files => 'unchanged') + end + it { should contain_exec('/usr/bin/apt-get -y -o Dpkg::Options::="--force-confdef" install my_package').with( + :unless => "/usr/bin/dpkg -s #{title} | grep -q 'Status: install'" + ) } + end + + describe "when specifying cfg_missing parameter" do + let :params do + default_params.merge(:cfg_missing => true) + end + it { should contain_exec('/usr/bin/apt-get -y -o Dpkg::Options::="--force-confmiss" install my_package').with( + :unless => "/usr/bin/dpkg -s #{title} | grep -q 'Status: install'" + ) } + end + + describe "when specifying cfg_files and cfg_missing parameter" do + let :params do + default_params.merge( + :cfg_files => 'unchanged', + :cfg_missing => true + ) + end + it { should contain_exec('/usr/bin/apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confmiss" install my_package').with( + :unless => "/usr/bin/dpkg -s #{title} | grep -q 'Status: install'" + ) } + end + describe "when specifying release and version parameters" do let :params do default_params.merge( @@ -49,8 +81,22 @@ describe 'apt::force', :type => :define do :version => '1' ) end - it { should contain_exec("/usr/bin/apt-get -y -t #{params[:release]} install #{title}=1").with( + it { should contain_exec("/usr/bin/apt-get -y -t #{params[:release]} install #{title}=1").with( :unless => "/usr/bin/apt-cache policy -t #{params[:release]} #{title} | /bin/grep -q 'Installed: #{params[:version]}'" ) } end + + describe "when specifying release, version, cfg_files and cfg_missing parameters" do + let :params do + default_params.merge( + :release => 'testing', + :version => '1', + :cfg_files => 'unchanged', + :cfg_missing => true + ) + end + it { should contain_exec('/usr/bin/apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confmiss" -t testing install my_package=1').with( + :unless => "/usr/bin/apt-cache policy -t #{params[:release]} #{title} | /bin/grep -q 'Installed: #{params[:version]}'" + ) } + end end -- 2.45.2