Merge pull request #466 from paroga/master
[puppet-modules/puppetlabs-apt.git] / manifests / force.pp
1 # force.pp
2 # force a package from a specific release
3
4 define apt::force(
5   $release     = false,
6   $version     = false,
7   $timeout     = 300,
8   $cfg_files   = 'none',
9   $cfg_missing = false,
10 ) {
11
12   validate_re($cfg_files, ['^new', '^old', '^unchanged', '^none'])
13   validate_bool($cfg_missing)
14
15   $provider = $apt::params::provider
16
17   $version_string = $version ? {
18     false   => undef,
19     default => "=${version}",
20   }
21
22   $release_string = $release ? {
23     false   => undef,
24     default => "-t ${release}",
25   }
26
27   case $cfg_files {
28     'new':           { $config_files = '-o Dpkg::Options::="--force-confnew"' }
29     'old':           { $config_files = '-o Dpkg::Options::="--force-confold"' }
30     'unchanged':     { $config_files = '-o Dpkg::Options::="--force-confdef"' }
31     'none', default: { $config_files = '' }
32   }
33
34   case $cfg_missing {
35     true:           { $config_missing = '-o Dpkg::Options::="--force-confmiss"' }
36     false, default: { $config_missing = '' }
37   }
38
39   if $version == false {
40     if $release == false {
41       $install_check = "/usr/bin/dpkg -s ${name} | grep -q 'Status: install'"
42     } else {
43       # If installed version and candidate version differ, this check returns 1 (false).
44       $install_check = "/usr/bin/test \$(/usr/bin/apt-cache policy -t ${release} ${name} | /bin/grep -E 'Installed|Candidate' | /usr/bin/uniq -s 14 | /usr/bin/wc -l) -eq 1"
45     }
46   } else {
47     if $release == false {
48       $install_check = "/usr/bin/dpkg -s ${name} | grep -q 'Version: ${version}'"
49     } else {
50       $install_check = "/usr/bin/apt-cache policy -t ${release} ${name} | /bin/grep -q 'Installed: ${version}'"
51     }
52   }
53
54   exec { "${provider} -y ${config_files} ${config_missing} ${release_string} install ${name}${version_string}":
55     unless      => $install_check,
56     environment => ['LC_ALL=C', 'LANG=C'],
57     logoutput   => 'on_failure',
58     timeout     => $timeout,
59   }
60 }