]> git.openstreetmap.org Git - chef.git/blob - cookbooks/exim/recipes/default.rb
ced5a91965c8721b00e281c4d8efb5b5f1322081
[chef.git] / cookbooks / exim / recipes / default.rb
1 #
2 # Cookbook:: exim
3 # Recipe:: default
4 #
5 # Copyright:: 2011, OpenStreetMap Foundation
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     https://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 include_recipe "munin"
21 include_recipe "networking"
22 include_recipe "prometheus"
23
24 package %w[
25   exim4
26   openssl
27   ssl-cert
28   mailutils
29 ]
30
31 package "exim4-daemon-heavy" do
32   only_if { ::File.exist?("/var/run/clamav/clamd.ctl") }
33 end
34
35 group "Debian-exim" do
36   action :modify
37   members "clamav"
38   append true
39   only_if { ::File.exist?("/var/run/clamav/clamd.ctl") }
40 end
41
42 group "ssl-cert" do
43   action :modify
44   members "Debian-exim"
45   append true
46 end
47
48 if node[:exim][:certificate_names]
49   include_recipe "apache"
50
51   apache_site node[:exim][:certificate_names].first do
52     template "apache.erb"
53     variables :aliases => node[:exim][:certificate_names].drop(1)
54   end
55
56   ssl_certificate node[:exim][:certificate_names].first do
57     domains node[:exim][:certificate_names]
58     notifies :restart, "service[exim4]"
59   end
60 else
61   openssl_x509_certificate "/etc/ssl/certs/exim.pem" do
62     key_file "/etc/ssl/private/exim.key"
63     owner "root"
64     group "ssl-cert"
65     mode "640"
66     org "OpenStreetMap"
67     email "postmaster@openstreetmap.org"
68     common_name node[:fqdn]
69     expire 3650
70     notifies :restart, "service[exim4]"
71   end
72 end
73
74 service "exim4" do
75   action [:enable, :start]
76   supports :status => true, :restart => true, :reload => true
77 end
78
79 relay_to_domains = node[:exim][:relay_to_domains]
80
81 node[:exim][:routes].each_value do |route|
82   relay_to_domains |= route[:domains] if route[:host]
83 end
84
85 relay_from_hosts = node[:exim][:relay_from_hosts]
86
87 if node[:exim][:smarthost_name]
88   search(:node, "exim_smarthost_via:*?").each do |host|
89     relay_from_hosts |= host.ipaddresses(:role => :external)
90   end
91
92   domains = node[:exim][:certificate_names].select { |c| c =~ /^a\.mx\./ }.collect { |c| c.sub(/^a\.mx./, "") }
93   primary_domain = domains.first
94
95   directory "/srv/mta-sts.#{primary_domain}" do
96     owner "root"
97     group "root"
98     mode "755"
99   end
100
101   domains.each do |domain|
102     template "/srv/mta-sts.#{primary_domain}/#{domain}.txt" do
103       source "mta-sts.erb"
104       owner "root"
105       group "root"
106       mode "644"
107       variables :domain => domain
108     end
109   end
110
111   ssl_certificate "mta-sts.#{primary_domain}" do
112     domains domains.collect { |d| "mta-sts.#{d}" }
113     notifies :reload, "service[apache2]"
114   end
115
116   apache_site "mta-sts.#{primary_domain}" do
117     template "apache-mta-sts.erb"
118     directory "/srv/mta-sts.#{primary_domain}"
119     variables :domains => domains
120   end
121 end
122
123 file "/etc/exim4/blocked-senders" do
124   owner "root"
125   group "Debian-exim"
126   mode "644"
127 end
128
129 file "/etc/exim4/blocked-sender-domains" do
130   owner "root"
131   group "Debian-exim"
132   mode "644"
133 end
134
135 if node[:exim][:dkim_selectors]
136   keys = data_bag_item("exim", "dkim")
137
138   template "/etc/exim4/dkim-domains" do
139     owner "root"
140     source "dkim-domains.erb"
141     group "Debian-exim"
142     mode "644"
143   end
144
145   template "/etc/exim4/dkim-selectors" do
146     owner "root"
147     source "dkim-selectors.erb"
148     group "Debian-exim"
149     mode "644"
150   end
151
152   directory "/etc/exim4/dkim-keys" do
153     owner "root"
154     group "Debian-exim"
155     mode "755"
156   end
157
158   node[:exim][:dkim_selectors].each do |domain, _selector|
159     file "/etc/exim4/dkim-keys/#{domain}" do
160       content keys[domain].join("\n")
161       owner "root"
162       group "Debian-exim"
163       mode "640"
164     end
165   end
166 end
167
168 template "/etc/default/exim4" do
169   source "default.erb"
170   owner "root"
171   group "root"
172   mode "044"
173   notifies :restart, "service[exim4]"
174 end
175
176 template "/etc/exim4/exim4.conf" do
177   source "exim4.conf.erb"
178   owner "root"
179   group "Debian-exim"
180   mode "644"
181   variables :relay_to_domains => relay_to_domains.sort,
182             :relay_from_hosts => relay_from_hosts.sort
183   notifies :restart, "service[exim4]"
184 end
185
186 search(:accounts, "*:*").each do |account|
187   name = account["id"]
188   details = node[:accounts][:users][name] || {}
189
190   if details[:status] && account["email"]
191     node.default[:exim][:aliases][name] = account["email"]
192   end
193 end
194
195 if node[:exim][:private_aliases]
196   aliases = data_bag_item("exim", "aliases")
197
198   aliases[node[:exim][:private_aliases]].each do |name, address|
199     node.default[:exim][:aliases][name] = address
200   end
201 end
202
203 template "/etc/aliases" do
204   source "aliases.erb"
205   owner "root"
206   group "root"
207   mode "644"
208 end
209
210 remote_directory "/etc/exim4/noreply" do
211   source "noreply"
212   owner "root"
213   group "Debian-exim"
214   mode "755"
215   files_owner "root"
216   files_group "Debian-exim"
217   files_mode "755"
218   purge true
219 end
220
221 template "/etc/mail.rc" do
222   source "mail.rc.erb"
223   owner "root"
224   group "root"
225   mode "644"
226 end
227
228 munin_plugin "exim_mailqueue"
229 munin_plugin "exim_mailstats"
230
231 prometheus_exporter "exim" do
232   port 9636
233   user "Debian-exim"
234   protect_proc "default"
235 end
236
237 if node[:exim][:smarthost_name]
238   firewall_rule "accept-inbound-smtp" do
239     action :accept
240     context :incoming
241     protocol :tcp
242     dest_ports node[:exim][:daemon_smtp_ports]
243     source_ports "1024-65535"
244   end
245 else
246   smarthosts = []
247
248   search(:node, "exim_smarthost_name:*?").each do |host|
249     smarthosts |= host.ipaddresses(:role => :external)
250   end
251
252   firewall_rule "accept-inbound-smtp" do
253     action :accept
254     context :incoming
255     protocol :tcp
256     source smarthosts
257     dest_ports node[:exim][:daemon_smtp_ports]
258     source_ports "1024-65535"
259     not_if { smarthosts.empty? }
260   end
261 end
262
263 if node[:exim][:smarthost_via]
264   firewall_rule "deny-outbound-smtp" do
265     action :reject
266     context :outgoing
267     protocol :tcp
268     dest_ports "smtp"
269   end
270 end