| # 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 |