> -----Original Message-----
> From: [email protected] <openembedded-
> [email protected]> On Behalf Of Steve Sakoman
> Sent: den 14 juni 2023 16:05
> To: [email protected]
> Subject: [OE-core][dunfell 3/5] systemd-systemctl: fix instance template
> WantedBy symlink construction
> 
> From: Martin Siegumfeldt <[email protected]>
> 
> Fix issue of the below instance template systemd service dependency
> 
> [Install]
> WantedBy=svc-wants@%i.service
> 
> creating the symlink (instance "a" example)
> 
> /etc/systemd/system/svc-wants@%i.service.wants/[email protected]
> 
> which should be
> 
> /etc/systemd/system/[email protected]/[email protected]
> 
> as implemented by this change.
> 
> The functionality appears regressed just after "thud" baseline when the
> logic was refactored from shell script into python (commit
> 925e30cb104ece7bfa48b78144e758a46dc9ec3f)
> 
> (From OE-Core rev: 308397f0bb3d6f3d4e9ec2c6a10823184049c9b5)
> 
> Signed-off-by: Martin Siegumfeldt <[email protected]>
> Signed-off-by: Alexandre Belloni <[email protected]>
> Signed-off-by: Richard Purdie <[email protected]>
> Signed-off-by: Steve Sakoman <[email protected]>
> (cherry picked from commit 372b29c8ad270d4d430c26a4e614976c7029afaf)
> Signed-off-by: Steve Sakoman <[email protected]>
> ---
>  .../systemd/systemd-systemctl/systemctl             | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/meta/recipes-core/systemd/systemd-systemctl/systemctl
> b/meta/recipes-core/systemd/systemd-systemctl/systemctl
> index 6aa2e20465..577c373181 100755
> --- a/meta/recipes-core/systemd/systemd-systemctl/systemctl
> +++ b/meta/recipes-core/systemd/systemd-systemctl/systemctl
> @@ -182,12 +182,19 @@ class SystemdUnit():
> 
>          raise SystemdUnitNotFoundError(self.root, unit)
> 
> -    def _process_deps(self, config, service, location, prop, dirstem):
> +    def _process_deps(self, config, service, location, prop, dirstem, 
> instance):
>          systemdir = self.root / SYSCONFDIR / "systemd" / "system"
> 
>          target = ROOT / location.relative_to(self.root)
>          try:
>              for dependent in config.get('Install', prop):
> +                # determine whether or not dependent is a template with an 
> actual
> +                # instance (i.e. a '@%i')
> +                dependent_is_template = 
> re.match(r"[^@]+@(?P<instance>[^\.]*)\.", dependent)
> +                if dependent_is_template:
> +                    # if so, replace with the actual instance to achieve
> +                    # [email protected]/[email protected]
> +                    dependent = 
> re.sub(dependent_is_template.group('instance'), instance, dependent, 1)
>                  wants = systemdir / "{}.{}".format(dependent, dirstem) / 
> service
>                  add_link(wants, target)
> 
> @@ -227,8 +234,8 @@ class SystemdUnit():
>          else:
>              service = self.unit
> 
> -        self._process_deps(config, service, path, 'WantedBy', 'wants')
> -        self._process_deps(config, service, path, 'RequiredBy', 'requires')
> +        self._process_deps(config, service, path, 'WantedBy', 'wants', 
> instance)
> +        self._process_deps(config, service, path, 'RequiredBy', 'requires', 
> instance)
> 
>          try:
>              for also in config.get('Install', 'Also'):
> --
> 2.34.1

You might want to be careful with this one. It broke systemctl for us when it 
hit Mickledore and we have had to backport the version from Langdale for now.

The problem is that it does not handle non-instanced units depending on 
an instanced unit. In our case we have a unit foo.service that contains 
a [email protected], which causes an error like this:

Traceback (most recent call last):
  File ".../recipe-sysroot-native/usr/bin/systemctl", line 366, in <module>
    main()
  File ".../recipe-sysroot-native/usr/bin/systemctl", line 352, in main
    SystemdUnit(root, service).enable()
  File ".../recipe-sysroot-native/usr/bin/systemctl", line 250, in enable
    self._process_deps(config, service, path, 'WantedBy', 'wants', instance)
  File ".../recipe-sysroot-native/usr/bin/systemctl", line 210, in _process_deps
    dependent = re.sub(dependent_is_template.group('instance'), instance, 
dependent, 1)
                
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../recipe-sysroot-native/usr/lib/python3.11/re/__init__.py", line 185, 
in sub
    return _compile(pattern, flags).sub(repl, string, count)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../recipe-sysroot-native/usr/lib/python3.11/re/__init__.py", line 317, 
in _subx
    template = _compile_repl(template, pattern)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../recipe-sysroot-native/usr/lib/python3.11/re/__init__.py", line 308, 
in _compile_repl
    return _parser.parse_template(repl, pattern)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../recipe-sysroot-native/usr/lib/python3.11/re/_parser.py", line 1000, 
in parse_template
    s = Tokenizer(source)
        ^^^^^^^^^^^^^^^^^
  File ".../recipe-sysroot-native/usr/lib/python3.11/re/_parser.py", line 226, 
in __init__
    string = str(string, 'latin1')
             ^^^^^^^^^^^^^^^^^^^^^
TypeError: decoding to str: need a bytes-like object, NoneType found

There are probably other cases too when different kinds of units are 
involved (at least as far as I could gather from the systemd manual).

We have an internal issue to fix this, but I am going on vacation on 
Monday, so I will unfortunately not have any time to look at it until 
after summer.

//Peter
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#182872): 
https://lists.openembedded.org/g/openembedded-core/message/182872
Mute This Topic: https://lists.openembedded.org/mt/99528202/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to