]> git.openstreetmap.org Git - chef.git/blob - cookbooks/planet/recipes/replication.rb
Improve filesystem sandboxing for planet replication services
[chef.git] / cookbooks / planet / recipes / replication.rb
1 #
2 # Cookbook:: planet
3 # Recipe:: dump
4 #
5 # Copyright:: 2013, 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 require "yaml"
21
22 include_recipe "accounts"
23 include_recipe "apt"
24 include_recipe "osmosis"
25 include_recipe "ruby"
26 include_recipe "tools"
27
28 db_passwords = data_bag_item("db", "passwords")
29
30 ## Install required packages
31
32 package %w[
33   postgresql-client
34   ruby-libxml
35   make
36   gcc
37   libc6-dev
38   libpq-dev
39   osmdbt
40 ]
41
42 gem_package "pg" do
43   gem_binary node[:ruby][:gem]
44 end
45
46 ## Build preload library to flush files
47
48 remote_directory "/opt/flush" do
49   source "flush"
50   owner "root"
51   group "root"
52   mode "755"
53   files_owner "root"
54   files_group "root"
55   files_mode "755"
56 end
57
58 execute "/opt/flush/Makefile" do
59   action :nothing
60   command "make"
61   cwd "/opt/flush"
62   user "root"
63   group "root"
64   subscribes :run, "remote_directory[/opt/flush]"
65 end
66
67 ## Install scripts
68
69 remote_directory "/usr/local/bin" do
70   source "replication-bin"
71   owner "root"
72   group "root"
73   mode "755"
74   files_owner "root"
75   files_group "root"
76   files_mode "755"
77 end
78
79 template "/usr/local/bin/users-agreed" do
80   source "users-agreed.erb"
81   owner "root"
82   group "root"
83   mode "755"
84 end
85
86 template "/usr/local/bin/users-deleted" do
87   source "users-deleted.erb"
88   owner "root"
89   group "root"
90   mode "755"
91 end
92
93 ## Published deleted users directory
94
95 remote_directory "/store/planet/users_deleted" do
96   source "users_deleted"
97   owner "planet"
98   group "planet"
99   mode "755"
100   files_owner "root"
101   files_group "root"
102   files_mode "644"
103 end
104
105 ## Published replication directory
106
107 remote_directory "/store/planet/replication" do
108   source "replication-cgi"
109   owner "root"
110   group "root"
111   mode "755"
112   files_owner "root"
113   files_group "root"
114   files_mode "755"
115 end
116
117 ## Configuration directory
118
119 directory "/etc/replication" do
120   owner "root"
121   group "root"
122   mode "755"
123 end
124
125 ## Transient state directory
126
127 systemd_tmpfile "/run/replication" do
128   type "d"
129   owner "planet"
130   group "planet"
131   mode "755"
132 end
133
134 ## Persistent state directory
135
136 directory "/var/lib/replication" do
137   owner "planet"
138   group "planet"
139   mode "755"
140 end
141
142 ## Temporary directory
143
144 directory "/store/replication" do
145   owner "planet"
146   group "planet"
147   mode "755"
148 end
149
150 ## Users replication
151
152 template "/etc/replication/users-agreed.conf" do
153   source "users-agreed.conf.erb"
154   user "planet"
155   group "planet"
156   mode "600"
157   variables :password => db_passwords["planetdiff"]
158 end
159
160 systemd_service "users-agreed" do
161   description "Update list of users accepting CTs"
162   user "planet"
163   exec_start "/usr/local/bin/users-agreed"
164   nice 10
165   private_tmp true
166   private_devices true
167   protect_system "strict"
168   protect_home true
169   read_write_paths "/store/planet/users_agreed"
170   restrict_address_families %w[AF_INET AF_INET6]
171   no_new_privileges true
172 end
173
174 systemd_timer "users-agreed" do
175   description "Update list of users accepting CTs"
176   on_calendar "7:00"
177 end
178
179 systemd_service "users-deleted" do
180   description "Update list of deleted users"
181   user "planet"
182   exec_start "/usr/local/bin/users-deleted"
183   nice 10
184   private_tmp true
185   private_devices true
186   protect_system "strict"
187   protect_home true
188   read_write_paths "/store/planet/users_deleted"
189   restrict_address_families %w[AF_INET AF_INET6]
190   no_new_privileges true
191 end
192
193 systemd_timer "users-deleted" do
194   description "Update list of deleted users"
195   on_calendar "17:00"
196 end
197
198 ## Changeset replication
199
200 directory "/store/planet/replication/changesets" do
201   owner "planet"
202   group "planet"
203   mode "755"
204 end
205
206 template "/etc/replication/changesets.conf" do
207   source "changesets.conf.erb"
208   user "root"
209   group "planet"
210   mode "640"
211   variables :password => db_passwords["planetdiff"]
212 end
213
214 systemd_service "replication-changesets" do
215   description "Changesets replication"
216   user "planet"
217   exec_start "/usr/local/bin/replicate-changesets /etc/replication/changesets.conf"
218   private_tmp true
219   private_devices true
220   protect_system "strict"
221   protect_home true
222   read_write_paths [
223     "/run/replication",
224     "/store/planet/replication/changesets"
225   ]
226   restrict_address_families %w[AF_INET AF_INET6]
227   no_new_privileges true
228 end
229
230 systemd_timer "replication-changesets" do
231   description "Changesets replication"
232   on_boot_sec 60
233   on_unit_active_sec 60
234   accuracy_sec 5
235 end
236
237 ## Minutely replication
238
239 directory "/store/planet/replication/minute" do
240   owner "planet"
241   group "planet"
242   mode "755"
243 end
244
245 directory "/var/lib/replication/minute" do
246   owner "planet"
247   group "planet"
248   mode "755"
249 end
250
251 directory "/store/replication/minute" do
252   owner "planet"
253   group "planet"
254   mode "755"
255 end
256
257 osmdbt_config = {
258   "database" => {
259     "host" => node[:web][:database_host],
260     "dbname" => "openstreetmap",
261     "user" => "planetdiff",
262     "password" => db_passwords["planetdiff"],
263     "replication_slot" => "osmdbt"
264   },
265   "log_dir" => "/var/lib/replication/minute",
266   "changes_dir" => "/store/planet/replication/minute",
267   "tmp_dir" => "/store/replication/minute",
268   "run_dir" => "/run/replication"
269 }
270
271 file "/etc/replication/osmdbt-config.yaml" do
272   user "root"
273   group "planet"
274   mode "640"
275   content YAML.dump(osmdbt_config)
276 end
277
278 systemd_service "replication-minutely" do
279   description "Minutely replication"
280   user "planet"
281   working_directory "/etc/replication"
282   exec_start "/usr/local/bin/replicate-minute"
283   private_tmp true
284   private_devices true
285   protect_system "strict"
286   protect_home true
287   read_write_paths [
288     "/run/replication",
289     "/store/replication/minute",
290     "/store/planet/replication/minute",
291     "/var/lib/replication/minute"
292   ]
293   restrict_address_families %w[AF_INET AF_INET6]
294   no_new_privileges true
295 end
296
297 systemd_timer "replication-minutely" do
298   description "Minutely replication"
299   on_boot_sec 60
300   on_unit_active_sec 60
301   accuracy_sec 5
302 end
303
304 ## Hourly replication
305
306 directory "/store/planet/replication/hour" do
307   owner "planet"
308   group "planet"
309   mode "755"
310 end
311
312 directory "/var/lib/replication/hour" do
313   owner "planet"
314   group "planet"
315   mode "755"
316 end
317
318 link "/var/lib/replication/hour/data" do
319   to "/store/planet/replication/hour"
320 end
321
322 template "/var/lib/replication/hour/configuration.txt" do
323   source "replication.config.erb"
324   owner "planet"
325   group "planet"
326   mode "644"
327   variables :base => "minute", :interval => 3600
328 end
329
330 systemd_service "replication-hourly" do
331   description "Hourly replication"
332   user "planet"
333   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/hour"
334   environment "LD_PRELOAD" => "/opt/flush/flush.so"
335   private_tmp true
336   private_devices true
337   protect_system "strict"
338   protect_home true
339   read_write_paths [
340     "/store/planet/replication/hour",
341     "/var/lib/replication/hour"
342   ]
343   restrict_address_families %w[AF_INET AF_INET6]
344   no_new_privileges true
345 end
346
347 systemd_timer "replication-hourly" do
348   description "Daily replication"
349   on_calendar "*-*-* *:02/15:00"
350 end
351
352 ## Daily replication
353
354 directory "/store/planet/replication/day" do
355   owner "planet"
356   group "planet"
357   mode "755"
358 end
359
360 directory "/var/lib/replication/day" do
361   owner "planet"
362   group "planet"
363   mode "755"
364 end
365
366 link "/var/lib/replication/day/data" do
367   to "/store/planet/replication/day"
368 end
369
370 template "/var/lib/replication/day/configuration.txt" do
371   source "replication.config.erb"
372   owner "planet"
373   group "planet"
374   mode "644"
375   variables :base => "hour", :interval => 86400
376 end
377
378 systemd_service "replication-daily" do
379   description "Daily replication"
380   user "planet"
381   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/day"
382   environment "LD_PRELOAD" => "/opt/flush/flush.so"
383   private_tmp true
384   private_devices true
385   protect_system "strict"
386   protect_home true
387   read_write_paths [
388     "/store/planet/replication/day",
389     "/var/lib/replication/day"
390   ]
391   restrict_address_families %w[AF_INET AF_INET6]
392   no_new_privileges true
393 end
394
395 systemd_timer "replication-daily" do
396   description "Daily replication"
397   on_calendar "*-*-* *:02/15:00"
398 end
399
400 ## Replication cleanup
401
402 systemd_service "replication-cleanup" do
403   description "Cleanup replication"
404   user "planet"
405   exec_start "/usr/local/bin/replicate-cleanup"
406   private_tmp true
407   private_devices true
408   private_network true
409   protect_system "strict"
410   protect_home true
411   read_write_paths "/var/lib/replication"
412   no_new_privileges true
413 end
414
415 systemd_timer "replication-cleanup" do
416   description "Cleanup replication"
417   on_boot_sec 60
418   on_unit_active_sec 86400
419   accuracy_sec 1800
420 end
421
422 ## Enable/disable feeds
423
424 if node[:planet][:replication] == "enabled"
425   service "users-agreed.timer" do
426     action [:enable, :start]
427   end
428
429   service "users-deleted.timer" do
430     action [:enable, :start]
431   end
432
433   service "replication-changesets.timer" do
434     action [:enable, :start]
435   end
436
437   service "replication-minutely.timer" do
438     action [:enable, :start]
439   end
440
441   service "replication-hourly.timer" do
442     action [:enable, :start]
443   end
444
445   service "replication-daily.timer" do
446     action [:enable, :start]
447   end
448
449   service "replication-cleanup.timer" do
450     action [:enable, :start]
451   end
452 else
453   service "users-agreed.timer" do
454     action [:stop, :disable]
455   end
456
457   service "users-deleted.timer" do
458     action [:stop, :disable]
459   end
460
461   service "replication-changesets.timer" do
462     action [:stop, :disable]
463   end
464
465   service "replication-minutely.timer" do
466     action [:stop, :disable]
467   end
468
469   service "replication-hourly.timer" do
470     action [:stop, :disable]
471   end
472
473   service "replication-daily.timer" do
474     action [:stop, :disable]
475   end
476
477   service "replication-cleanup.timer" do
478     action [:stop, :disable]
479   end
480 end