apt::source: Make location mostly required.
[puppet-modules/puppetlabs-apt.git] / manifests / init.pp
1 #
2 class apt(
3   $update   = {},
4   $purge    = {},
5   $proxy    = {},
6   $sources  = {},
7   $keys     = {},
8   $ppas     = {},
9   $settings = {},
10 ) inherits ::apt::params {
11
12   $frequency_options = ['always','daily','weekly','reluctantly']
13   validate_hash($update)
14   if $update['frequency'] {
15     validate_re($update['frequency'], $frequency_options)
16   }
17   if $update['always'] {
18     validate_bool($update['always'])
19   }
20   if $update['timeout'] {
21     unless is_integer($update['timeout']) {
22       fail('timeout value for update must be an integer')
23     }
24   }
25   if $update['tries'] {
26     unless is_integer($update['tries']) {
27       fail('tries value for update must be an integer')
28     }
29   }
30
31   $_update = merge($::apt::update_defaults, $update)
32   include apt::update
33
34   validate_hash($purge)
35   if $purge['sources.list'] {
36     validate_bool($purge['sources.list'])
37   }
38   if $purge['sources.list.d'] {
39     validate_bool($purge['sources.list.d'])
40   }
41   if $purge['preferences'] {
42     validate_bool($purge['preferences'])
43   }
44   if $purge['preferences.d'] {
45     validate_bool($purge['preferences.d'])
46   }
47
48   $_purge = merge($::apt::purge_defaults, $purge)
49
50   validate_hash($proxy)
51   if $proxy['host'] {
52     validate_string($proxy['host'])
53   }
54   if $proxy['port'] {
55     unless is_integer($proxy['port']) {
56       fail('$proxy port must be an integer')
57     }
58   }
59   if $proxy['https'] {
60     validate_bool($proxy['https'])
61   }
62
63   $_proxy = merge($apt::proxy_defaults, $proxy)
64
65   validate_hash($sources)
66   validate_hash($keys)
67   validate_hash($settings)
68   validate_hash($ppas)
69
70   if $proxy['host'] {
71     apt::setting { 'conf-proxy':
72       priority => '01',
73       content  => template('apt/_header.erb', 'apt/proxy.erb'),
74     }
75   }
76
77   $sources_list_content = $_purge['sources.list'] ? {
78     false => undef,
79     true  => "# Repos managed by puppet.\n",
80   }
81
82   $preferences_ensure = $_purge['preferences'] ? {
83     false => file,
84     true  => absent,
85   }
86
87   if $_update['always'] {
88     Exec <| title=='apt_update' |> {
89       refreshonly => false,
90     }
91   }
92
93   apt::setting { 'conf-update-stamp':
94     priority => 15,
95     content  => template('apt/_header.erb', 'apt/15update-stamp.erb'),
96   }
97
98   file { 'sources.list':
99     ensure  => file,
100     path    => $::apt::sources_list,
101     owner   => root,
102     group   => root,
103     mode    => '0644',
104     content => $sources_list_content,
105     notify  => Exec['apt_update'],
106   }
107
108   file { 'sources.list.d':
109     ensure  => directory,
110     path    => $::apt::sources_list_d,
111     owner   => root,
112     group   => root,
113     mode    => '0644',
114     purge   => $_purge['sources.list.d'],
115     recurse => $_purge['sources.list.d'],
116     notify  => Exec['apt_update'],
117   }
118
119   file { 'preferences':
120     ensure => $preferences_ensure,
121     path   => $::apt::preferences,
122     owner  => root,
123     group  => root,
124     mode   => '0644',
125     notify => Exec['apt_update'],
126   }
127
128   file { 'preferences.d':
129     ensure  => directory,
130     path    => $::apt::preferences_d,
131     owner   => root,
132     group   => root,
133     mode    => '0644',
134     purge   => $_purge['preferences.d'],
135     recurse => $_purge['preferences.d'],
136     notify  => Exec['apt_update'],
137   }
138
139   # Need anchor to provide containment for dependencies.
140   anchor { 'apt::update':
141     require => Class['apt::update'],
142   }
143
144   # manage sources if present
145   if $sources {
146     create_resources('apt::source', $sources)
147   }
148   # manage keys if present
149   if $keys {
150     create_resources('apt::key', $keys)
151   }
152   # manage ppas if present
153   if $ppas {
154     create_resources('apt::ppa', $ppas)
155   }
156   # manage settings if present
157   if $settings {
158     create_resources('apt::setting', $settings)
159   }
160 }