# pin a release in apt, useful for unstable repositories
define apt::pin(
- $ensure = present,
- $explanation = "${::caller_module_name}: ${name}",
- $order = '',
- $packages = '*',
- $priority = 0,
- $release = '',
- $origin = '',
- $originator = '',
- $version = ''
+ $ensure = present,
+ $explanation = "${::caller_module_name}: ${name}",
+ $order = '',
+ $packages = '*',
+ $priority = 0,
+ $release = '', # a=
+ $origin = '',
+ $version = '',
+ $codename = '', # n=
+ $release_version = '', # v=
+ $component = '', # c=
+ $originator = '', # o=
+ $label = '', # l=
) {
include apt::params
fail('Only integers are allowed in the apt::pin order param')
}
- if $release != '' {
- $pin = "release a=${release}"
- } elsif $origin != '' {
- $pin = "origin \"${origin}\""
- } elsif $originator != '' {
- $pin = "release o=${originator}"
- } elsif $version != '' {
- $pin = "version ${version}"
- } else {
- $pin = "release a=${name}"
+ $pin_release = join([
+ $release,
+ $codename,
+ $release_version,
+ $component,
+ $originator,
+ $label], '')
+
+ # Read the manpage 'apt_preferences(5)', especially the chapter
+ # 'Thea Effect of APT Preferences' to understand the following logic
+ # and the difference between specific and general form
+ if $packages != '*' { # specific form
+
+ if ( $pin_release != '' and ( $origin != '' or $version != '' )) or
+ ( $origin != '' and ( $pin_release != '' or $version != '' )) or
+ ( $version != '' and ( $pin_release != '' or $origin != '' )) {
+ fail('parameters release, origin, and version are mutually exclusive')
+ }
+
+ } else { # general form
+
+ if $version != '' {
+ fail('parameter version cannot be used in general form')
+ }
+
+ if ( $pin_release != '' and $origin != '' ) or
+ ( $origin != '' and $pin_release != '' ) {
+ fail('parmeters release and origin are mutually exclusive')
+ }
+
}
$path = $order ? {
}
end
- [ {},
+ [
+ { :params => {},
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: *\nPin: release a=my_pin\nPin-Priority: 0\n"
+ },
{
- :packages => 'apache',
- :priority => '1'
+ :params => {
+ :packages => 'apache',
+ :priority => '1'
+ },
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: apache\nPin: release a=my_pin\nPin-Priority: 1\n"
},
{
- :order => 50,
- :packages => 'apache',
- :priority => '1'
+ :params => {
+ :order => 50,
+ :packages => 'apache',
+ :priority => '1'
+ },
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: apache\nPin: release a=my_pin\nPin-Priority: 1\n"
},
{
- :ensure => 'absent',
- :packages => 'apache',
- :priority => '1'
+ :params => {
+ :ensure => 'absent',
+ :packages => 'apache',
+ :priority => '1'
+ },
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: apache\nPin: release a=my_pin\nPin-Priority: 1\n"
},
{
- :packages => 'apache',
- :priority => '1',
- :release => 'my_newpin'
- }
+ :params => {
+ :packages => 'apache',
+ :priority => '1',
+ :release => 'my_newpin'
+ },
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: apache\nPin: release a=my_newpin\nPin-Priority: 1\n"
+ },
+ {
+ :params => {
+ :packages => 'apache',
+ :priority => '1',
+ :version => '2.2.16*'
+ },
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: apache\nPin: version 2.2.16*\nPin-Priority: 1\n"
+ },
+ {
+ :params => {
+ :priority => '1',
+ :origin => 'ftp.de.debian.org'
+ },
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: *\nPin: origin \"ftp.de.debian.org\"\nPin-Priority: 1\n"
+ },
+ {
+ :params => {
+ :packages => 'apache',
+ :priority => '1',
+ :release => 'stable',
+ :codename => 'wheezy',
+ :release_version => '3.0',
+ :component => 'main',
+ :originator => 'Debian',
+ :label => 'Debian'
+ },
+ :content => "# my_pin\nExplanation: : my_pin\nPackage: apache\nPin: release a=stable, n=wheezy, v=3.0, c=main, o=Debian, l=Debian\nPin-Priority: 1\n"
+ },
].each do |param_set|
describe "when #{param_set == {} ? "using default" : "specifying"} define parameters" do
let :param_hash do
- default_params.merge(param_set)
+ default_params.merge(param_set[:params])
end
let :params do
- param_set
+ param_set[:params]
end
it { should include_class("apt::params") }
'owner' => 'root',
'group' => 'root',
'mode' => '0644',
- 'content' => "# #{title}\nExplanation: : #{title}\nPackage: #{param_hash[:packages]}\nPin: release a=#{param_hash[:release] || title}\nPin-Priority: #{param_hash[:priority]}\n",
+ 'content' => param_set[:content],
})
}
end
+<%-
+@pin = "release a=#{@name}" # default value
+if @pin_release.length > 0
+ options = []
+ options.push("a=#{@release}") if @release.length > 0
+ options.push("n=#{@codename}") if @codename.length > 0
+ options.push("v=#{@release_version}") if @release_version.length > 0
+ options.push("c=#{@component}") if @component.length > 0
+ options.push("o=#{@originator}") if @originator.length > 0
+ options.push("l=#{@label}") if @label.length > 0
+ @pin = "release #{options.join(', ')}"
+elsif @version.length > 0
+ @pin = "version #{@version}"
+elsif @origin.length > 0
+ @pin = "origin \"#{@origin}\""
+end
+-%>
# <%= @name %>
Explanation: <%= @explanation %>
Package: <%= @packages %>