|  | # 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('<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"\n') | 
|  | fd.write('        "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">\n') | 
|  | fd.write('<busconfig>\n') | 
|  | fd.write('        <policy user="%s">\n' % user) | 
|  | fd.write('                <allow own="%s"/>\n' % bus) | 
|  | fd.write('                <allow send_destination="%s"/>\n' % bus) | 
|  | fd.write('        </policy>\n') | 
|  | fd.write('</busconfig>\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 |