X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=manifests%2Fpin.pp;h=bd8b470b1710160879bbeb7e3e9c7bd9e99d1720;hb=refs%2Fheads%2Fpdksync_CONT-1001-update_litmus_dep;hp=21cc3ffdefc0294c0c91c37de474971b94b26869;hpb=75092fdbf1b87dbff22ae5b728b390c778db6d91;p=puppet-modules%2Fpuppetlabs-apt.git diff --git a/manifests/pin.pp b/manifests/pin.pp index 21cc3ff..bd8b470 100644 --- a/manifests/pin.pp +++ b/manifests/pin.pp @@ -1,48 +1,136 @@ -# pin.pp -# 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 = '' +# @summary Manages Apt pins. Does not trigger an apt-get update run. +# +# @see http://linux.die.net/man/5/apt_preferences for context on these parameters +# +# @param ensure +# Specifies whether the pin should exist. Valid options: 'file', 'present', and 'absent'. +# +# @param explanation +# Supplies a comment to explain the pin. Default: "${caller_module_name}: ${name}". +# +# @param order +# Determines the order in which Apt processes the pin file. Files with lower order numbers are loaded first. +# +# @param packages +# Specifies which package(s) to pin. +# +# @param priority +# Sets the priority of the package. If multiple versions of a given package are available, `apt-get` installs the one with the highest +# priority number (subject to dependency constraints). Valid options: an integer. +# +# @param release +# Tells APT to prefer packages that support the specified release. Typical values include 'stable', 'testing', and 'unstable'. +# +# @param release_version +# Tells APT to prefer packages that support the specified operating system release version (such as Debian release version 7). +# +# @param component +# Names the licensing component associated with the packages in the directory tree of the Release file. +# +# @param originator +# Names the originator of the packages in the directory tree of the Release file. +# +# @param label +# Names the label of the packages in the directory tree of the Release file. +# +# @param origin +# The package origin +# +# @param version +# The version of the package +# +# @param codename +# The codename of the package +# +define apt::pin ( + Enum['file', 'present', 'absent'] $ensure = present, + Optional[String] $explanation = undef, + Variant[Integer] $order = 50, + Variant[String, Array] $packages = '*', + Variant[Numeric, String] $priority = 0, + Optional[String] $release = undef, # a= + Optional[String] $origin = undef, + Optional[String] $version = undef, + Optional[String] $codename = undef, # n= + Optional[String] $release_version = undef, # v= + Optional[String] $component = undef, # c= + Optional[String] $originator = undef, # o= + Optional[String] $label = undef, # l= ) { - - include apt::params - - $preferences_d = $apt::params::preferences_d - - if $order != '' and !is_integer($order) { - fail('Only integers are allowed in the apt::pin order param') + if $explanation { + $_explanation = $explanation + } else { + if defined('$caller_module_name') { # strict vars check + $_explanation = "${caller_module_name}: ${name}" + } else { + $_explanation = ": ${name}" + } } - if $release != '' { - $pin = "release a=${release}" - } elsif $origin != '' { - $pin = "origin \"${origin}\"" - } elsif $originator != '' { - $pin = "release o=${originator}" - } elsif $version != '' { - $pin = "version ${version}" + $pin_release_array = [ + $release, + $codename, + $release_version, + $component, + $originator, + $label, + ] + $pin_release = join($pin_release_array, '') + + # Read the manpage 'apt_preferences(5)', especially the chapter + # 'The Effect of APT Preferences' to understand the following logic + # and the difference between specific and general form + if $packages =~ Array { + $packages_string = join($packages, ' ') } else { - $pin = "release a=${name}" + $packages_string = $packages } - $path = $order ? { - '' => "${preferences_d}/${name}.pref", - default => "${preferences_d}/${order}-${name}.pref", + if $packages_string != '*' { # specific form + if ( $pin_release != '' and ( $origin 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 ) { + fail('parameters release and origin are mutually exclusive') + } } - file { "${name}.pref": - ensure => $ensure, - path => $path, - owner => root, - group => root, - mode => '0644', - content => template('apt/pin.pref.erb'), + + # According to man 5 apt_preferences: + # The files have either no or "pref" as filename extension + # and only contain alphanumeric, hyphen (-), underscore (_) and period + # (.) characters. Otherwise APT will print a notice that it has ignored a + # file, unless that file matches a pattern in the + # Dir::Ignore-Files-Silently configuration list - in which case it will + # be silently ignored. + $file_name = regsubst($title, '[^0-9a-z\-_\.]', '_', 'IG') + + $headertmp = epp('apt/_header.epp') + + $pinpreftmp = epp('apt/pin.pref.epp', { + 'name' => $name, + 'pin_release' => $pin_release, + 'release' => $release, + 'codename' => $codename, + 'release_version' => $release_version, + 'component' => $component, + 'originator' => $originator, + 'label' => $label, + 'version' => $version, + 'origin' => $origin, + 'explanation' => $_explanation, + 'packages_string' => $packages_string, + 'priority' => $priority, + }) + + apt::setting { "pref-${file_name}": + ensure => $ensure, + priority => $order, + content => "${headertmp}${pinpreftmp}", + notify_update => false, } }