cookbooks/fb_dbus/resources/implementation.rb (68 lines of code) (raw):
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
#
# Copyright (c) 2018-present, Facebook, Inc.
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
property :implementation, ['dbus-daemon', 'dbus-broker']
default_action :setup
load_current_value do
s = Mixlib::ShellOut.new('systemctl -q is-active dbus-broker')
s.run_command
if s.exitstatus.zero?
implementation 'dbus-broker'
# 3 == inactive
# 4 == does not exist
elsif [3, 4].include?(s.exitstatus)
implementation 'dbus-daemon'
else
fail "fb_dbus: invalid status for dbus-broker: #{s.exitstatus}"
end
end
action :setup do
wanted_impl = new_resource.implementation
current_impl = current_resource.implementation
# Only enable dbus-daemon if it's the wanted implementation; if it's also the
# current one, ensure it's started
if wanted_impl == 'dbus-daemon'
dbus_action = [:enable]
if current_impl == 'dbus-daemon'
dbus_action << :start
end
else
dbus_action = [:disable]
end
if node.centos7? || node.centos8?
dbus_daemon_svc = 'dbus'
else
# On CentOS Stream 9, this socket needs to be explicitly enabled for
# dbus-broker to work properly
systemd_unit 'dbus.socket' do
action [:enable, :start]
end
dbus_daemon_svc = 'dbus-daemon'
end
service dbus_daemon_svc do
action dbus_action
end
# Only enable dbus-broker if it's the wanted implementation; if it's also the
# current one, ensure it's started
if wanted_impl == 'dbus-broker'
dbus_broker_action = [:enable]
if current_impl == 'dbus-broker'
dbus_broker_action << :start
end
else
dbus_broker_action = [:disable]
end
service 'dbus-broker' do
action dbus_broker_action
end
# For user sessions, only enable dbus-broker if it's the wanted implementation
link '/etc/systemd/user/dbus.service' do
to '/usr/lib/systemd/user/dbus-broker.service'
if wanted_impl == 'dbus-broker'
action :create
else
action :delete
end
end
# If we need to switch dbus implementation and we're allowed to, request a
# reboot
if wanted_impl != current_impl
if node['fb_dbus']['allow_implementation_switch']
fb_helpers_reboot 'switch dbus implementation' do
required node['fb_dbus']['reboot_required']
action :deferred
end
else
Chef::Log.warn(
"fb_dbus: current dbus implementation is #{current_impl} but" +
"#{wanted_impl} is desired; reboot to complete the switchover",
)
end
end
end