40a40aff07650e457eabd3d56d1960f33176607a
[puppet-modules/puppetlabs-apt.git] / manifests / init.pp
1 # == Class: apt
2 #
3 # Manage APT (Advanced Packaging Tool)
4 #
5 class apt (
6   Variant[Hash, Stdlib::Compat::Hash] $update_defaults,
7   Variant[Hash, Stdlib::Compat::Hash] $purge_defaults,
8   Variant[Hash, Stdlib::Compat::Hash] $proxy_defaults,
9   Variant[Hash, Stdlib::Compat::Hash] $include_defaults,
10   Variant[String, Stdlib::Compat::String] $provider,
11   Variant[String, Stdlib::Compat::String] $keyserver,
12   Optional[Variant[String, Stdlib::Compat::String]] $ppa_options,
13   Optional[Variant[String, Stdlib::Compat::String]] $ppa_package,
14   Optional[Variant[Hash, Stdlib::Compat::Hash]] $backports,
15   Variant[Hash, Stdlib::Compat::Hash] $confs                = {},
16   Variant[Hash, Stdlib::Compat::Hash] $update               = {},
17   Variant[Hash, Stdlib::Compat::Hash] $purge                = {},
18   Variant[Hash, Stdlib::Compat::Hash] $proxy                = {},
19   Variant[Hash, Stdlib::Compat::Hash] $sources              = {},
20   Variant[Hash, Stdlib::Compat::Hash] $keys                 = {},
21   Variant[Hash, Stdlib::Compat::Hash] $ppas                 = {},
22   Variant[Hash, Stdlib::Compat::Hash] $pins                 = {},
23   Variant[Hash, Stdlib::Compat::Hash] $settings             = {},
24   Variant[String, Stdlib::Compat::String] $root             = '/etc/apt',
25   Variant[String, Stdlib::Compat::String] $sources_list     = "${root}/sources.list",
26   Variant[String, Stdlib::Compat::String] $sources_list_d   = "${root}/sources.list.d",
27   Variant[String, Stdlib::Compat::String] $conf_d           = "${root}/apt.conf.d",
28   Variant[String, Stdlib::Compat::String] $preferences      = "${root}/preferences",
29   Variant[String, Stdlib::Compat::String] $preferences_d    = "${root}/preferences.d",
30   Variant[Hash, Stdlib::Compat::Hash] $config_files         = { conf => { path => $conf_d, ext => '' }, pref => { path => $preferences_d, ext => '.pref' }, list => { path => $sources_list_d, ext => '.list' } },
31   Variant[Hash, Stdlib::Compat::Hash] $source_key_defaults  = { 'server' => $keyserver, 'options' => undef, 'content' => undef, 'source' => undef },
32 ) {
33
34   if $facts['osfamily'] != 'Debian' {
35     fail('This module only works on Debian or derivatives like Ubuntu')
36   }
37
38   $frequency_options = ['always','daily','weekly','reluctantly']
39   validate_legacy(Hash, 'validate_hash', $update)
40   if $update['frequency'] {
41     validate_re($update['frequency'], $frequency_options)
42   }
43   if $update['timeout'] {
44     unless is_integer($update['timeout']) {
45       fail('timeout value for update must be an integer')
46     }
47   }
48   if $update['tries'] {
49     unless is_integer($update['tries']) {
50       fail('tries value for update must be an integer')
51     }
52   }
53
54   $_update = merge($::apt::update_defaults, $update)
55   include ::apt::update
56
57   validate_legacy(Hash, 'validate_hash', $purge)
58   if $purge['sources.list'] {
59     validate_legacy(Boolean, 'validate_bool', $purge['sources.list'])
60   }
61   if $purge['sources.list.d'] {
62     validate_legacy(Boolean, 'validate_bool', $purge['sources.list.d'])
63   }
64   if $purge['preferences'] {
65     validate_legacy(Boolean, 'validate_bool', $purge['preferences'])
66   }
67   if $purge['preferences.d'] {
68     validate_legacy(Boolean, 'validate_bool', $purge['preferences.d'])
69   }
70
71   $_purge = merge($::apt::purge_defaults, $purge)
72
73   validate_hash($proxy)
74   if $proxy['ensure'] {
75     validate_re($proxy['ensure'], ['file', 'present', 'absent'])
76   }
77   if $proxy['host'] {
78     validate_legacy(String, 'validate_string', $proxy['host'])
79   }
80   if $proxy['port'] {
81     unless is_integer($proxy['port']) {
82       fail('$proxy port must be an integer')
83     }
84   }
85   if $proxy['https'] {
86     validate_legacy(Boolean, 'validate_bool', $proxy['https'])
87   }
88
89   $_proxy = merge($apt::proxy_defaults, $proxy)
90
91   validate_legacy(Hash, 'validate_hash', $confs)
92   validate_legacy(Hash, 'validate_hash', $sources)
93   validate_legacy(Hash, 'validate_hash', $keys)
94   validate_legacy(Hash, 'validate_hash', $settings)
95   validate_legacy(Hash, 'validate_hash', $ppas)
96   validate_legacy(Hash, 'validate_hash', $pins)
97
98   $confheadertmp = epp('apt/_conf_header.epp')
99   $proxytmp = epp('apt/proxy.epp', {'proxies' => $_proxy})
100   $updatestamptmp = epp('apt/15update-stamp.epp')
101
102   if $_proxy['ensure'] == 'absent' or $_proxy['host'] {
103     apt::setting { 'conf-proxy':
104       ensure   => $_proxy['ensure'],
105       priority => '01',
106       content  => "${confheadertmp}${proxytmp}",
107     }
108   }
109
110   $sources_list_content = $_purge['sources.list'] ? {
111     true    => "# Repos managed by puppet.\n",
112     default => undef,
113   }
114
115   $preferences_ensure = $_purge['preferences'] ? {
116     true    => absent,
117     default => file,
118   }
119
120   if $_update['frequency'] == 'always' {
121     Exec <| title=='apt_update' |> {
122       refreshonly => false,
123     }
124   }
125
126   apt::setting { 'conf-update-stamp':
127     priority => 15,
128     content  => "${confheadertmp}${updatestamptmp}",
129   }
130
131   file { 'sources.list':
132     ensure  => file,
133     path    => $::apt::sources_list,
134     owner   => root,
135     group   => root,
136     mode    => '0644',
137     content => $sources_list_content,
138     notify  => Class['apt::update'],
139   }
140
141   file { 'sources.list.d':
142     ensure  => directory,
143     path    => $::apt::sources_list_d,
144     owner   => root,
145     group   => root,
146     mode    => '0644',
147     purge   => $_purge['sources.list.d'],
148     recurse => $_purge['sources.list.d'],
149     notify  => Class['apt::update'],
150   }
151
152   file { 'preferences':
153     ensure => $preferences_ensure,
154     path   => $::apt::preferences,
155     owner  => root,
156     group  => root,
157     mode   => '0644',
158     notify => Class['apt::update'],
159   }
160
161   file { 'preferences.d':
162     ensure  => directory,
163     path    => $::apt::preferences_d,
164     owner   => root,
165     group   => root,
166     mode    => '0644',
167     purge   => $_purge['preferences.d'],
168     recurse => $_purge['preferences.d'],
169     notify  => Class['apt::update'],
170   }
171
172   if $confs {
173     create_resources('apt::conf', $confs)
174   }
175   # manage sources if present
176   if $sources {
177     create_resources('apt::source', $sources)
178   }
179   # manage keys if present
180   if $keys {
181     create_resources('apt::key', $keys)
182   }
183   # manage ppas if present
184   if $ppas {
185     create_resources('apt::ppa', $ppas)
186   }
187   # manage settings if present
188   if $settings {
189     create_resources('apt::setting', $settings)
190   }
191
192   # manage pins if present
193   if $pins {
194     create_resources('apt::pin', $pins)
195   }
196 }