(GH-cat-9) syntax:hiera:yaml fixes
[puppet-modules/puppetlabs-apt.git] / manifests / pin.pp
1 # @summary Manages Apt pins. Does not trigger an apt-get update run.
2 #
3 # @see http://linux.die.net/man/5/apt_preferences for context on these parameters
4 #
5 # @param ensure
6 #   Specifies whether the pin should exist. Valid options: 'file', 'present', and 'absent'.
7 #
8 # @param explanation
9 #   Supplies a comment to explain the pin. Default: "${caller_module_name}: ${name}".
10 #
11 # @param order
12 #   Determines the order in which Apt processes the pin file. Files with lower order numbers are loaded first.
13 #
14 # @param packages
15 #   Specifies which package(s) to pin.
16 #
17 # @param priority
18 #   Sets the priority of the package. If multiple versions of a given package are available, `apt-get` installs the one with the highest 
19 #   priority number (subject to dependency constraints). Valid options: an integer.
20 #
21 # @param release
22 #   Tells APT to prefer packages that support the specified release. Typical values include 'stable', 'testing', and 'unstable'.
23 #
24 # @param release_version
25 #   Tells APT to prefer packages that support the specified operating system release version (such as Debian release version 7).
26 #
27 # @param component
28 #   Names the licensing component associated with the packages in the directory tree of the Release file.
29 #
30 # @param originator
31 #   Names the originator of the packages in the directory tree of the Release file.
32 #
33 # @param label
34 #   Names the label of the packages in the directory tree of the Release file.
35 #
36 define apt::pin (
37   Enum['file', 'present', 'absent'] $ensure           = present,
38   Optional[String] $explanation                       = undef,
39   Variant[Integer] $order                             = 50,
40   Variant[String, Array] $packages                    = '*',
41   Variant[Numeric, String] $priority                  = 0,
42   Optional[String] $release                           = '', # a=
43   Optional[String] $origin                            = '',
44   Optional[String] $version                           = '',
45   Optional[String] $codename                          = '', # n=
46   Optional[String] $release_version                   = '', # v=
47   Optional[String] $component                         = '', # c=
48   Optional[String] $originator                        = '', # o=
49   Optional[String] $label                             = '',  # l=
50 ) {
51   if $explanation {
52     $_explanation = $explanation
53   } else {
54     if defined('$caller_module_name') { # strict vars check
55       $_explanation = "${caller_module_name}: ${name}"
56     } else {
57       $_explanation = ": ${name}"
58     }
59   }
60
61   $pin_release_array = [
62     $release,
63     $codename,
64     $release_version,
65     $component,
66     $originator,
67     $label,
68   ]
69   $pin_release = join($pin_release_array, '')
70
71   # Read the manpage 'apt_preferences(5)', especially the chapter
72   # 'The Effect of APT Preferences' to understand the following logic
73   # and the difference between specific and general form
74   if $packages =~ Array {
75     $packages_string = join($packages, ' ')
76   } else {
77     $packages_string = $packages
78   }
79
80   if $packages_string != '*' { # specific form
81     if ( $pin_release != '' and ( $origin != '' or $version != '' )) or
82       ( $version != '' and ( $pin_release != '' or $origin != '' )) {
83       fail('parameters release, origin, and version are mutually exclusive')
84     }
85   } else { # general form
86     if $version != '' {
87       fail('parameter version cannot be used in general form')
88     }
89     if ( $pin_release != '' and $origin != '' ) {
90       fail('parameters release and origin are mutually exclusive')
91     }
92   }
93
94   # According to man 5 apt_preferences:
95   # The files have either no or "pref" as filename extension
96   # and only contain alphanumeric, hyphen (-), underscore (_) and period
97   # (.) characters. Otherwise APT will print a notice that it has ignored a
98   # file, unless that file matches a pattern in the
99   # Dir::Ignore-Files-Silently configuration list - in which case it will
100   # be silently ignored.
101   $file_name = regsubst($title, '[^0-9a-z\-_\.]', '_', 'IG')
102
103   $headertmp = epp('apt/_header.epp')
104
105   $pinpreftmp = epp('apt/pin.pref.epp', {
106       'name'            => $name,
107       'pin_release'     => $pin_release,
108       'release'         => $release,
109       'codename'        => $codename,
110       'release_version' => $release_version,
111       'component'       => $component,
112       'originator'      => $originator,
113       'label'           => $label,
114       'version'         => $version,
115       'origin'          => $origin,
116       'explanation'     => $_explanation,
117       'packages_string' => $packages_string,
118       'priority'        => $priority,
119   })
120
121   apt::setting { "pref-${file_name}":
122     ensure        => $ensure,
123     priority      => $order,
124     content       => "${headertmp}${pinpreftmp}",
125     notify_update => false,
126   }
127 }