+disks = disks.compact.uniq
+
+if disks.count.positive?
+ package "smartmontools"
+
+ template "/etc/cron.daily/update-smart-drivedb" do
+ source "update-smart-drivedb.erb"
+ owner "root"
+ group "root"
+ mode "755"
+ end
+
+ template "/usr/local/bin/smartd-mailer" do
+ source "smartd-mailer.erb"
+ owner "root"
+ group "root"
+ mode "755"
+ end
+
+ template "/etc/smartd.conf" do
+ source "smartd.conf.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ variables :disks => disks
+ end
+
+ template "/etc/default/smartmontools" do
+ source "smartmontools.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ end
+
+ service "smartmontools" do
+ action [:enable, :start]
+ subscribes :reload, "template[/etc/smartd.conf]"
+ subscribes :restart, "template[/etc/default/smartmontools]"
+ end
+
+ template "/etc/prometheus/collectors/smart.devices" do
+ source "smart.devices.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ variables :disks => disks
+ end
+
+ prometheus_collector "smart" do
+ interval "15m"
+ user "root"
+ capability_bounding_set %w[CAP_DAC_OVERRIDE CAP_SYS_ADMIN CAP_SYS_RAWIO]
+ private_devices false
+ private_users false
+ protect_clock false
+ end
+
+ # Don't try and do munin monitoring of disks behind
+ # an Areca controller as they only allow one thing to
+ # talk to the controller at a time and smartd will
+ # throw errors if it clashes with munin
+ disks = disks.reject { |disk| disk[:smart]&.start_with?("areca,") }
+
+ disks.each do |disk|
+ munin_plugin "smart_#{disk[:munin]}" do
+ target "smart_"
+ conf "munin.smart.erb"
+ conf_variables :disk => disk
+ end
+ end
+else
+ service "smartd" do
+ action [:stop, :disable]
+ end
+end
+
+if disks.count.positive?
+ munin_plugin "hddtemp_smartctl" do
+ conf "munin.hddtemp.erb"
+ conf_variables :disks => disks
+ end
+else
+ munin_plugin "hddtemp_smartctl" do
+ action :delete
+ conf "munin.hddtemp.erb"
+ end
+end
+
+plugins = Dir.glob("/etc/munin/plugins/smart_*").map { |p| File.basename(p) } -
+ disks.map { |d| "smart_#{d[:munin]}" }
+
+plugins.each do |plugin|
+ munin_plugin plugin do
+ action :delete
+ conf "munin.smart.erb"
+ end
+end
+
+if File.exist?("/etc/mdadm/mdadm.conf")
+ mdadm_conf = edit_file "/etc/mdadm/mdadm.conf" do |line|
+ line.gsub!(/^MAILADDR .*$/, "MAILADDR admins@openstreetmap.org")
+
+ line
+ end
+
+ file "/etc/mdadm/mdadm.conf" do
+ owner "root"
+ group "root"
+ mode "644"
+ content mdadm_conf
+ end
+
+ service "mdmonitor" do
+ action :nothing
+ subscribes :restart, "file[/etc/mdadm/mdadm.conf]"
+ end