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