File: pin.pp

package info (click to toggle)
puppet-module-puppetlabs-apt 9.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 572 kB
  • sloc: ruby: 438; sh: 31; makefile: 2
file content (136 lines) | stat: -rw-r--r-- 4,754 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# @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=
) {
  if $explanation {
    $_explanation = $explanation
  } else {
    if defined('$caller_module_name') { # strict vars check
      $_explanation = "${caller_module_name}: ${name}"
    } else {
      $_explanation = ": ${name}"
    }
  }

  $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 {
    $packages_string = $packages
  }

  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')
    }
  }

  # 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,
  }
}