[Pkg-systemd-maintainers] Bug#719695: Bug#719695: Bug#719695: Bug#719695: Prefer symlinks over Alias= for non-matching service names

Lennart Poettering lennart at poettering.net
Sun Mar 2 23:43:41 GMT 2014


On Sun, 02.03.14 02:08, Michael Stapelberg (stapelberg at debian.org) wrote:

Could you please send the patch to the systemd ML for review?

> [+cc lennart]
> 
> Hi Michael,
> 
> Michael Biebl <biebl at debian.org> writes:
> >>> Maybe we could convince Lennart to allow that.
> >> AFAIR, I read that you made some progress with Lennart on this. Could
> >> you update this bug accordingly please? Thanks.
> >
> > [19:50:51] <poettering> mbiebl: so, i'd be fine with allowing
> > enable/disable to follow symlinks in /usr/lib before starting to do its
> > thing
> > [19:50:59] <poettering> mbiebl: however, i am strictly against following
> > them through /etc
> > [19:51:17] <poettering> mbiebl: because symlinks /etc is the stuff the
> > tool manages after all
> > [19:51:22] <mbiebl> nod
> > [19:51:25] <poettering> mbiebl: and it shouldn't get confused by its own
> > doings
> > [19:51:30] <mbiebl> it would be for static symlinks only
> > [19:52:01] <poettering> so, the current logic simply skips all symlinks,
> > and i'd be happy to change that to skip only the symlinks in /etc, /run,
> > and so on
> Alright. After an eternity, I decided to have a look at this issue
> again. When creating /lib/systemd/system/rsync-alias.service →
> rsync.service, with the attached patch I can enable/disable the service:
> 
> midna $ sudo systemctl status rsync-alias.service      
> rsync.service - fast remote file copy program daemon                           
>    Loaded: loaded (/lib/systemd/system/rsync.service; enabled)
>    Active: inactive (dead)
>           start condition failed at Sun 2014-03-02 01:39:20 CET; 23min ago
> 
> Mar 02 01:39:20 midna systemd[1]: Started fast remote file copy program daemon.
> 
> midna $ sudo systemctl disable rsync-alias.service
> rm '/etc/systemd/system/multi-user.target.wants/rsync.service'
> 
> midna $ sudo systemctl status rsync-alias.service
> rsync.service - fast remote file copy program daemon
>    Loaded: loaded (/lib/systemd/system/rsync.service; disabled)
>    Active: inactive (dead)
> 
> Mar 02 01:39:20 midna systemd[1]: Started fast remote file copy program daemon.
> 
> midna $ sudo systemctl enable rsync-alias.service
> ln -s '/lib/systemd/system/rsync.service' '/etc/systemd/system/multi-user.target.wants/rsync.service'
> 
> midna $ sudo systemctl status rsync-alias.service
> rsync.service - fast remote file copy program daemon
>    Loaded: loaded (/lib/systemd/system/rsync.service; enabled)
>    Active: inactive (dead)
> 
> Mar 02 01:39:20 midna systemd[1]: Started fast remote file copy program daemon.
> 
> However, mask and unmask are still using rsync-alias.service, not
> rsync.service.
> 
> Lennart, does the patch look good to you so far? Or are we on the wrong
> path entirely?
> 
> Which other systemctl verbs will need special casing apart from
> enable|disable|mask|unmask?
> 
> Thanks.
> 
> PS: If you wanted to take this patch and hack this feature in, I
> definitely wouldn’t mind :-).
> 

> diff --git i/src/shared/install.c w/src/shared/install.c
> index f57b94d..8f9596b 100644
> --- i/src/shared/install.c
> +++ w/src/shared/install.c
> @@ -1023,6 +1023,8 @@ static int unit_file_load(
>                  (int) strv_length(info->required_by);
>  }
>  
> +#define FOLLOW_MAX 8
> +
>  static int unit_file_search(
>                  InstallContext *c,
>                  InstallInfo *info,
> @@ -1053,11 +1055,44 @@ static int unit_file_search(
>                  if (!path)
>                          return -ENOMEM;
>  
> +                int cnt = 0;
> +                for (;;) {
> +                        if (cnt++ >= FOLLOW_MAX)
> +                                return -ELOOP;
> +
> +                        r = unit_file_load(c, info, path, allow_symlink);
> +
> +                        /* symlinks are always allowed for units in {/usr,}/lib/systemd so that
> +                         * one can alias units without using Alias= (the downside of Alias= is
> +                         * that the alias only exists when the unit is enabled). */
> +                        if (r >= 0)
> +                                break;
> +
> +                        if (r != -ELOOP)
> +                                break;
> +
> +                        if (allow_symlink)
> +                                break;
> +
> +                        if (!path_startswith(path, "/lib/systemd") &&
> +                            !path_startswith(path, "/usr/lib/systemd"))
> +                                break;
> +
> +                        char *target;
> +                        r = readlink_and_make_absolute(path, &target);
> +                        if (r < 0)
> +                                return r;
> +                        free(path);
> +                        path = target;
> +                }
> +
>                  r = unit_file_load(c, info, path, allow_symlink);
>  
> -                if (r >= 0)
> +                if (r >= 0) {
>                          info->path = path;
> -                else {
> +                        free(info->name);
> +                        info->name = strdup(path_get_file_name(path));
> +                } else {
>                          if (r == -ENOENT && unit_name_is_instance(info->name)) {
>                                  /* Unit file doesn't exist, however instance enablement was requested.
>                                   * We will check if it is possible to load template unit file. */



Lennart

-- 
Lennart Poettering, Red Hat




More information about the Pkg-systemd-maintainers mailing list