[OE-core] [PATCH 2/3] systemd.bbclass: add support to manage user services

Pau Espin Pedrol pespin.shar at gmail.com
Wed Sep 7 12:14:19 UTC 2016


2016-09-07 11:22 GMT+02:00 Chen Qi <Qi.Chen at windriver.com>:

> Add new variable SYSTEMD_USER_SERVICE and SYSTEM_USER_AUTO_ENABLE
> to manage user services. Their usage is like SYSTEMD_SERVICE and
> SYSTEMD_AUTO_ENABLE.
>
> [YOCTO #7800]
>
> Signed-off-by: Chen Qi <Qi.Chen at windriver.com>
> ---
>  meta/classes/systemd.bbclass | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/meta/classes/systemd.bbclass b/meta/classes/systemd.bbclass
> index db7873f..78cec97 100644
> --- a/meta/classes/systemd.bbclass
> +++ b/meta/classes/systemd.bbclass
> @@ -7,6 +7,7 @@ SYSTEMD_PACKAGES_class-nativesdk ?= ""
>
>  # Whether to enable or disable the services on installation.
>  SYSTEMD_AUTO_ENABLE ??= "enable"
> +SYSTEMD_USER_AUTO_ENABLE ??= "enable"
>
>  # This class will be included in any recipe that supports systemd init
> scripts,
>  # even if systemd is not in DISTRO_FEATURES.  As such don't make any
> changes
> @@ -30,10 +31,14 @@ fi
>
>  if type systemctl >/dev/null 2>/dev/null; then
>         systemctl $OPTS ${SYSTEMD_AUTO_ENABLE} ${SYSTEMD_SERVICE}
> +       systemctl $OPTS --global ${SYSTEMD_USER_AUTO_ENABLE}
> ${SYSTEMD_USER_SERVICE}
>

I'm not sure having these 2 systemctl being executed together everytime is
a good idea. What if a recipe has a user service and no system service? We
are calling the first one with an empty system service? Or we are may be
enabling a systemd system service which should not be enabled according to
the recipe? I have the feeling this kind of cases are not being catch in
here and other pkg scripts in this commit.

It is far from perfect, but in case you didn't, you may want to have a look
at my initial/previous commit to try to fix the issue:
https://www.mail-archive.com/openembedded-devel@lists.openembedded.org/msg42187.html


>
>         if [ -z "$D" -a "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
>                 systemctl restart ${SYSTEMD_SERVICE}
>         fi
> +       if [ -z "$D" -a "${SYSTEMD_USER_AUTO_ENABLE}" = "enable" ]; then
> +               systemctl --global restart ${SYSTEMD_USER_SERVICE}
> +       fi
>  fi
>  }
>
> @@ -47,9 +52,11 @@ fi
>  if type systemctl >/dev/null 2>/dev/null; then
>         if [ -z "$D" ]; then
>                 systemctl stop ${SYSTEMD_SERVICE}
> +               systemctl --global stop ${SYSTEMD_USER_SERVICE}
>

I think this is not gonna work, you cannot call --global with stop afair.
I'm not sure which is the good solution for this though, but you should
ideally go through all systemd user sessions and call "systemctl --user
stop". No idea if that's actually easily feasible.


>         fi
>
>         systemctl $OPTS disable ${SYSTEMD_SERVICE}
> +       systemctl $OPTS --global disable ${SYSTEMD_USER_SERVICE}
>  fi
>  }
>
> @@ -139,12 +146,14 @@ python systemd_populate_packages() {
>      def systemd_check_services():
>          searchpaths = [oe.path.join(d.getVar("sysconfdir", True),
> "systemd", "system"),]
>          searchpaths.append(d.getVar("systemd_system_unitdir", True))
> +        searchpaths.append(oe.path.join(d.getVar("sysconfdir", True),
> "systemd", "user"))
> +        searchpaths.append(d.getVar("systemd_user_unitdir", True))
>          systemd_packages = d.getVar('SYSTEMD_PACKAGES', True)
>
>          keys = 'Also'
>          # scan for all in SYSTEMD_SERVICE[]
>          for pkg_systemd in systemd_packages.split():
> -            for service in get_package_var(d, 'SYSTEMD_SERVICE',
> pkg_systemd).split():
> +            for service in (get_package_var(d, 'SYSTEMD_SERVICE',
> pkg_systemd) + get_package_var(d, 'SYSTEMD_USER_SERVICE',
> pkg_systemd)).split():
>                  path_found = ''
>
>                  # Deal with adding, for example, 'ifplugd at eth0.service'
> from
> @@ -165,14 +174,14 @@ python systemd_populate_packages() {
>                  if path_found != '':
>                      systemd_add_files_and_parse(pkg_systemd, path_found,
> service, keys)
>                  else:
> -                    raise bb.build.FuncFailed("SYSTEMD_SERVICE_%s value
> %s does not exist" % \
> -                        (pkg_systemd, service))
> +                    raise bb.build.FuncFailed("SYSTEMD_SERVICE_%s or
> SYSTEMD_USER_SERVICE_%s value %s does not exist" % \
> +                        (pkg_systemd, pkg_systemd, service))
>
>      # Run all modifications once when creating package
>      if os.path.exists(d.getVar("D", True)):
>          for pkg in d.getVar('SYSTEMD_PACKAGES', True).split():
>              systemd_check_package(pkg)
> -            if d.getVar('SYSTEMD_SERVICE_' + pkg, True):
> +            if d.getVar('SYSTEMD_SERVICE_' + pkg, True) or
> d.getVar('SYSTEMD_USER_SERVICE_' + pkg, True):
>                  systemd_generate_package_scripts(pkg)
>          systemd_check_services()
>  }
> --
> 1.9.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20160907/da98b40e/attachment-0002.html>


More information about the Openembedded-core mailing list