# Utilities and shortcuts for recipes providing D-Bus services. # Variables: # DBUS_PACKAGES ?= "${PN}" # The list of packages to which files should be added. # # DBUS_SERVICE_${PN} += "org.openbmc.Foo.service" # A list of dbus service names. The class will look for a # dbus configuration file with the same base name with .conf # appended. If one is found, it is added to the package # and used verbatim. If it is not found, a default one # (with very open permissions) is generated and used. # # Additionally the class will instantiate obmc-phosphor-systemd # with any SYSTEMD_SERVICE_%s variables translated appropriately. # # If a service begins with 'dbus-' DBus activation will be # configured. The class will look for an activation file # with the 'dbus-' prefix removed. If found, it is added to # the package and used verbatim. If it is not found, a default # one is generated and used. inherit dbus-dir inherit obmc-phosphor-utils RDEPENDS_${PN}_append_class-target = " dbus-perms" DBUS_PACKAGES ?= "${PN}" _INSTALL_DBUS_CONFIGS="" _DEFAULT_DBUS_CONFIGS="" _INSTALL_DBUS_ACTIVATIONS="" _DEFAULT_DBUS_ACTIVATIONS="" python dbus_do_postinst() { def make_default_dbus_config(d, unit, user): bus = unit.base if unit.is_template: bus = '%s*' % bus path = d.getVar('D', True) path += d.getVar('dbus_system_confdir', True) with open('%s/%s.conf' % (path, unit.base), 'w+') as fd: fd.write('\n') fd.write('\n') fd.write(' \n' % user) fd.write(' \n' % bus) fd.write(' \n' % bus) fd.write(' \n') fd.write('\n') fd.close() def make_default_dbus_activation(d, unit, user): dest = unit.base sd_unit = unit.name if unit.is_instance: dest = '%s.%s' % (unit.base, unit.instance) sd_unit = '%s@%s' % (unit.base, unit.instance) path = d.getVar('D', True) path += d.getVar('dbus_system_servicesdir', True) with open('%s/%s.service' % (path, dest), 'w+') as fd: fd.write('[D-BUS Service]\n') fd.write('Name=%s\n' % dest) fd.write('Exec=/bin/false\n') fd.write('User=%s\n' % user) fd.write('SystemdService=dbus-%s.service\n' % sd_unit) fd.close() for service_user in listvar_to_list(d, '_DEFAULT_DBUS_CONFIGS'): service, user = service_user.split(':') make_default_dbus_config(d, SystemdUnit(service), user) for service_user in listvar_to_list(d, '_DEFAULT_DBUS_ACTIVATIONS'): service, user = service_user.split(':') make_default_dbus_activation(d, SystemdUnit(service), user) } python() { searchpaths = d.getVar('FILESPATH', True) def get_user(d, service, pkg): user = d.getVar( 'SYSTEMD_USER_%s' % service, True) if user is None: user = d.getVar( 'SYSTEMD_USER_%s' % pkg, True) or 'root' return user def add_dbus_config(d, unit, pkg): path = bb.utils.which(searchpaths, '%s.conf' % unit.base) if not os.path.isfile(path): user = get_user(d, unit.name, pkg) set_append(d, '_DEFAULT_DBUS_CONFIGS', '%s:%s' % ( unit.name, user)) else: set_append(d, 'SRC_URI', 'file://%s.conf' % unit.base) set_append(d, '_INSTALL_DBUS_CONFIGS', '%s.conf' % unit.base) set_append(d, 'FILES_%s' % pkg, '%s%s.conf' \ % (d.getVar('dbus_system_confdir', True), unit.base)) def add_dbus_activation(d, unit, pkg): if not unit.is_activated or unit.is_template: return search_match = '%s.service' % unit.base if unit.is_instance: search_match = '%s.%s.service' % (unit.base, unit.instance) path = bb.utils.which(searchpaths, search_match) if not os.path.isfile(path): user = get_user(d, unit.base, pkg) set_append(d, '_DEFAULT_DBUS_ACTIVATIONS', '%s:%s' % ( unit.name, user)) else: set_append(d, 'SRC_URI', 'file://%s' % search_match) set_append(d, '_INSTALL_DBUS_ACTIVATIONS', search_match) set_append(d, 'FILES_%s' % pkg, '%s%s' \ % (d.getVar('dbus_system_servicesdir', True), search_match)) if d.getVar('CLASSOVERRIDE', True) != 'class-target': return d.appendVarFlag('do_install', 'postfuncs', ' dbus_do_postinst') for pkg in listvar_to_list(d, 'DBUS_PACKAGES'): if pkg not in (d.getVar('SYSTEMD_PACKAGES', True) or ''): set_append(d, 'SYSTEMD_PACKAGES', pkg) svc = listvar_to_list(d, 'DBUS_SERVICE_%s' % pkg) svc = [SystemdUnit(x) for x in svc] inst = [x for x in svc if x.is_instance] tmpl = [x.template for x in svc if x.is_instance] tmpl = list(set(tmpl)) tmpl = [SystemdUnit(x) for x in tmpl] svc = [x for x in svc if not x.is_instance] for unit in inst: set_append( d, 'SYSTEMD_SERVICE_%s' % pkg, unit.name) for unit in tmpl + svc: add_dbus_config(d, unit, pkg) add_dbus_activation(d, unit, pkg) set_append( d, 'SYSTEMD_SERVICE_%s' % pkg, unit.name) set_append(d, 'SYSTEMD_SUBSTITUTIONS', 'BUSNAME:%s:%s' % (unit.base, unit.name)) } do_install_append() { # install the dbus configuration files [ -z "${_INSTALL_DBUS_CONFIGS}" ] && \ [ -z "${_DEFAULT_DBUS_CONFIGS}" ] || \ install -d ${D}${dbus_system_confdir} for c in ${_INSTALL_DBUS_CONFIGS}; do install -m 0644 ${WORKDIR}/$c \ ${D}${dbus_system_confdir}$c done # install the dbus activation files [ -z "${_INSTALL_DBUS_ACTIVATIONS}" ] && \ [ -z "${_DEFAULT_DBUS_ACTIVATIONS}" ] || \ install -d ${D}${dbus_system_servicesdir} for s in ${_INSTALL_DBUS_ACTIVATIONS}; do install -m 0644 ${WORKDIR}/$s\ ${D}${dbus_system_servicesdir}$s done } inherit obmc-phosphor-systemd