2022-03-07 14:15:42 +03:00
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -ex
# Silence warning from running_in_chroot_or_offline()
export SYSTEMD_IGNORE_CHROOT = 1
systemctl = ${ 1 :- systemctl }
unset root
cleanup( ) {
[ -n " $root " ] && rm -rf " $root "
}
trap cleanup exit
root = $( mktemp -d --tmpdir systemctl-test.XXXXXX)
islink( ) {
test -h " $1 " || return 1
test " $( readlink " $1 " ) " = " $2 " || return 2
}
: ------enablement nonexistent--------------------------------
" $systemctl " --root= " $root " enable test1.service && { echo "Expected failure" >& 2; exit 1; }
: ------basic enablement--------------------------------------
mkdir -p " $root /etc/systemd/system "
cat >" $root /etc/systemd/system/test1.service " <<EOF
[ Install]
WantedBy = default.target
RequiredBy = special.target
EOF
" $systemctl " --root= " $root " enable test1.service
test -h " $root /etc/systemd/system/default.target.wants/test1.service "
test -h " $root /etc/systemd/system/special.target.requires/test1.service "
" $systemctl " --root= " $root " reenable test1.service
test -h " $root /etc/systemd/system/default.target.wants/test1.service "
test -h " $root /etc/systemd/system/special.target.requires/test1.service "
" $systemctl " --root= " $root " disable test1.service
test ! -e " $root /etc/systemd/system/default.target.wants/test1.service "
test ! -e " $root /etc/systemd/system/special.target.requires/test1.service "
: ------suffix guessing---------------------------------------
" $systemctl " --root= " $root " enable test1
test -h " $root /etc/systemd/system/default.target.wants/test1.service "
test -h " $root /etc/systemd/system/special.target.requires/test1.service "
" $systemctl " --root= " $root " reenable test1
test -h " $root /etc/systemd/system/default.target.wants/test1.service "
test -h " $root /etc/systemd/system/special.target.requires/test1.service "
" $systemctl " --root= " $root " disable test1
test ! -e " $root /etc/systemd/system/default.target.wants/test1.service "
test ! -e " $root /etc/systemd/system/special.target.requires/test1.service "
: -------aliases----------------------------------------------
cat >>" $root /etc/systemd/system/test1.service " <<EOF
Alias = test1-goodalias.service
Alias = test1@badalias.service
Alias = test1-badalias.target
Alias = test1-badalias.socket
shared/install: return failure when enablement fails, but process as much as possible
So far we'd issue a warning (before this series, just in the logs on the server
side, and before this commit, on stderr on the caller's side), but return
success. It seems that successfull return was introduced by mistake in
aa0f357fd833feecbea6c3e9be80b643e433bced (my fault :( ), which was supposed to
be a refactoring without a functional change. I think it's better to fail,
because if enablement fails, the user will most likely want to diagnose the
issue.
Note that we still do partial enablement, as far as that is possible. So if
e.g. we have [Install] Alias=foo.service foobar, we'll create the symlink
'foo.service', but not 'foobar', since that's not a valid unit name. We'll
print info about the action taken, and about 'foobar' being invalid, and return
failure.
2022-03-10 17:47:12 +03:00
# we have a series of good, bad, and then good again
Alias = test1-goodalias2.service
2022-03-07 14:15:42 +03:00
EOF
shared/install: return failure when enablement fails, but process as much as possible
So far we'd issue a warning (before this series, just in the logs on the server
side, and before this commit, on stderr on the caller's side), but return
success. It seems that successfull return was introduced by mistake in
aa0f357fd833feecbea6c3e9be80b643e433bced (my fault :( ), which was supposed to
be a refactoring without a functional change. I think it's better to fail,
because if enablement fails, the user will most likely want to diagnose the
issue.
Note that we still do partial enablement, as far as that is possible. So if
e.g. we have [Install] Alias=foo.service foobar, we'll create the symlink
'foo.service', but not 'foobar', since that's not a valid unit name. We'll
print info about the action taken, and about 'foobar' being invalid, and return
failure.
2022-03-10 17:47:12 +03:00
" $systemctl " --root= " $root " enable test1 && { echo "Expected failure" >& 2; exit 1; }
test -h " $root /etc/systemd/system/default.target.wants/test1.service "
test -h " $root /etc/systemd/system/special.target.requires/test1.service "
test ! -e " $root /etc/systemd/system/test1-goodalias.service "
test -h " $root /etc/systemd/system/test1-goodalias.service "
test ! -e " $root /etc/systemd/system/test1@badalias.service "
test ! -e " $root /etc/systemd/system/test1-badalias.target "
test ! -e " $root /etc/systemd/system/test1-badalias.socket "
test -h " $root /etc/systemd/system/test1-goodalias2.service "
2022-03-07 14:15:42 +03:00
: -------aliases in reeanble----------------------------------
shared/install: return failure when enablement fails, but process as much as possible
So far we'd issue a warning (before this series, just in the logs on the server
side, and before this commit, on stderr on the caller's side), but return
success. It seems that successfull return was introduced by mistake in
aa0f357fd833feecbea6c3e9be80b643e433bced (my fault :( ), which was supposed to
be a refactoring without a functional change. I think it's better to fail,
because if enablement fails, the user will most likely want to diagnose the
issue.
Note that we still do partial enablement, as far as that is possible. So if
e.g. we have [Install] Alias=foo.service foobar, we'll create the symlink
'foo.service', but not 'foobar', since that's not a valid unit name. We'll
print info about the action taken, and about 'foobar' being invalid, and return
failure.
2022-03-10 17:47:12 +03:00
" $systemctl " --root= " $root " reenable test1 && { echo "Expected failure" >& 2; exit 1; }
2022-03-07 14:15:42 +03:00
test -h " $root /etc/systemd/system/default.target.wants/test1.service "
test ! -e " $root /etc/systemd/system/test1-goodalias.service "
test -h " $root /etc/systemd/system/test1-goodalias.service "
test ! -e " $root /etc/systemd/system/test1@badalias.service "
test ! -e " $root /etc/systemd/system/test1-badalias.target "
test ! -e " $root /etc/systemd/system/test1-badalias.socket "
" $systemctl " --root= " $root " disable test1
test ! -e " $root /etc/systemd/system/default.target.wants/test1.service "
test ! -e " $root /etc/systemd/system/special.target.requires/test1.service "
test ! -e " $root /etc/systemd/system/test1-goodalias.service "
: -------also units-------------------------------------------
cat >" $root /etc/systemd/system/test2.socket " <<EOF
[ Install]
WantedBy = sockets.target
Also = test2.service
EOF
cat >" $root /etc/systemd/system/test2.service " <<EOF
[ Install]
WantedBy = default.target
Also = test2.socket
EOF
" $systemctl " --root= " $root " reenable test2.service
test -h " $root /etc/systemd/system/default.target.wants/test2.service "
test -h " $root /etc/systemd/system/sockets.target.wants/test2.socket "
" $systemctl " --root= " $root " reenable test2.socket
test -h " $root /etc/systemd/system/default.target.wants/test2.service "
test -h " $root /etc/systemd/system/sockets.target.wants/test2.socket "
" $systemctl " --root= " $root " disable test2.socket
test ! -e " $root /etc/systemd/system/default.target.wants/test2.service "
test ! -e " $root /etc/systemd/system/sockets.target.wants/test2.socket "
: -------link-------------------------------------------------
# File doesn't exist yet
test ! -e " $root /link1.path "
" $systemctl " --root= " $root " link '/link1.path' && { echo "Expected failure" >& 2; exit 1; }
test ! -e " $root /etc/systemd/system/link1.path "
cat >" $root /link1.path " <<EOF
[ Install]
WantedBy = paths.target
EOF
" $systemctl " --root= " $root " link '/link1.path'
islink " $root /etc/systemd/system/link1.path " "/link1.path"
: -------link already linked same path------------------------
SYSTEMD_LOG_LEVEL = debug " $systemctl " --root= " $root " link '/link1.path' # this passes
islink " $root /etc/systemd/system/link1.path " "/link1.path"
: -------link already linked different path-------------------
mkdir " $root /subdir "
cp " $root /link1.path " " $root /subdir/ "
" $systemctl " --root= " $root " link '/subdir/link1.path' && { echo "Expected failure" >& 2; exit 1; }
islink " $root /etc/systemd/system/link1.path " "/link1.path"
: -------link bad suffix--------------------------------------
cp " $root /link1.path " " $root /subdir/link1.suffix "
" $systemctl " --root= " $root " link '/subdir/link1.suffix' && { echo "Expected failure" >& 2; exit 1; }
test ! -e " $root /etc/systemd/system/link1.suffix "
: -------unlink by unit name----------------------------------
" $systemctl " --root= " $root " disable 'link1.path'
test ! -e " $root /etc/systemd/system/link1.path "
: -------unlink by path---------------------------------------
" $systemctl " --root= " $root " link '/link1.path'
test -h " $root /etc/systemd/system/link1.path "
" $systemctl " --root= " $root " disable '/link1.path'
test ! -e " $root /etc/systemd/system/link1.path "
: -------unlink by wrong path---------------------------------
" $systemctl " --root= " $root " link '/link1.path'
test -h " $root /etc/systemd/system/link1.path "
" $systemctl " --root= " $root " disable '/subdir/link1.path' # we only care about the name
test ! -e " $root /etc/systemd/system/link1.path "
: -------link and enable--------------------------------------
" $systemctl " --root= " $root " enable '/link1.path'
islink " $root /etc/systemd/system/link1.path " "/link1.path"
islink " $root /etc/systemd/system/paths.target.wants/link1.path " "/link1.path"
: -------enable already linked same path----------------------
" $systemctl " --root= " $root " enable '/link1.path'
islink " $root /etc/systemd/system/link1.path " "/link1.path"
islink " $root /etc/systemd/system/paths.target.wants/link1.path " "/link1.path"
: -------enable already linked different path-----------------
# FIXME
# "$systemctl" --root="$root" enable '/subdir/link1.path' && { echo "Expected failure" >&2; exit 1; }
# test -h "$root/etc/systemd/system/link1.path"
# readlink "$root/etc/systemd/system/link1.path"
# test -h "$root/etc/systemd/system/paths.target.wants/link1.path"
# readlink "$root/etc/systemd/system/paths.target.wants/link1.path"
: -------enable bad suffix------------------------------------
cp " $root /link1.path " " $root /subdir/link1.suffix "
" $systemctl " --root= " $root " enable '/subdir/link1.suffix' && { echo "Expected failure" >& 2; exit 1; }
test ! -e " $root /etc/systemd/system/link1.suffix "
test ! -e " $root /etc/systemd/system/paths.target.wants/link1.suffix "
: -------disable by unit name---------------------------------
" $systemctl " --root= " $root " disable 'link1.path'
test ! -e " $root /etc/systemd/system/link1.path "
test ! -e " $root /etc/systemd/system/paths.target.wants/link1.path "
: -------disable by path--------------------------------------
" $systemctl " --root= " $root " enable '/link1.path'
test -h " $root /etc/systemd/system/link1.path "
test -h " $root /etc/systemd/system/paths.target.wants/link1.path "
" $systemctl " --root= " $root " disable '/link1.path'
test ! -e " $root /etc/systemd/system/link1.path "
test ! -e " $root /etc/systemd/system/paths.target.wants/link1.path "
: -------link then enable-------------------------------------
" $systemctl " --root= " $root " link '/link1.path'
islink " $root /etc/systemd/system/link1.path " "/link1.path"
test ! -h " $root /etc/systemd/system/paths.target.wants/link1.path "
" $systemctl " --root= " $root " enable 'link1.path'
islink " $root /etc/systemd/system/link1.path " "/link1.path"
islink " $root /etc/systemd/system/paths.target.wants/link1.path " "/link1.path"
# FIXME
# "$systemctl" --root="$root" reenable 'link1.path'
# islink "$root/etc/systemd/system/link1.path" "/link1.path"
# islink "$root/etc/systemd/system/paths.target.wants/link1.path" "/link1.path"
: -------manual link------------------------------------------
cat >" $root /link3.suffix " <<EOF
[ Install]
WantedBy = services.target
EOF
ln -s "/link3.suffix" " $root /etc/systemd/system/link3.service "
# SYSTEMD_LOG_LEVEL=debug SYSTEMD_LOG_LOCATION=1 "$systemctl" --root="$root" enable 'link3.service'
# islink "$root/etc/systemd/system/link3.service" "/link3.suffix"
# islink "$root/etc/systemd/system/services.target.wants/link3.service" "../link3.service"
# unit_file_load_or_readlink() needs to be fixed to not follow links
: -------enable on masked-------------------------------------
ln -s "/dev/null" " $root /etc/systemd/system/masked.service "
" $systemctl " --root= " $root " enable 'masked.service' && { echo "Expected failure" >& 2; exit 1; }
" $systemctl " --root= " $root " enable '/etc/systemd/system/masked.service' && { echo "Expected failure" >& 2; exit 1; }
: -------enable on masked alias-------------------------------
test -h " $root /etc/systemd/system/masked.service "
ln -s "masked.service" " $root /etc/systemd/system/masked-alias.service "
" $systemctl " --root= " $root " enable 'masked-alias.service' && { echo "Expected failure" >& 2; exit 1; }
" $systemctl " --root= " $root " enable '/etc/systemd/system/masked-alias.service' && { echo "Expected failure" >& 2; exit 1; }
: -------issue 22000: link in subdirectory--------------------
mkdir -p " $root /etc/systemd/system/myown.d "
cat >" $root /etc/systemd/system/link5-also.service " <<EOF
[ Install]
WantedBy = services.target
Also = link5.service
EOF
cat >" $root /etc/systemd/system/myown.d/link5.service " <<EOF
[ Install]
WantedBy = services.target
Also = link5-also.service
EOF
" $systemctl " --root= " $root " enable 'link5.service' && { echo "Expected failure" >& 2; exit 1; }
test ! -h " $root /etc/systemd/system/services.target.wants/link5.service "
test ! -h " $root /etc/systemd/system/services.target.wants/link5-also.service "
" $systemctl " --root= " $root " enable 'link5-also.service'
test ! -h " $root /etc/systemd/system/services.target.wants/link5.service "
islink " $root /etc/systemd/system/services.target.wants/link5-also.service " "/etc/systemd/system/link5-also.service"
: -------template enablement----------------------------------
cat >" $root /etc/systemd/system/templ1@.service " <<EOF
[ Install]
WantedBy = services.target
EOF
# No instance here — this can't succeed.
" $systemctl " --root= " $root " enable 'templ1@.service' && { echo "Expected failure" >& 2; exit 1; }
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
" $systemctl " --root= " $root " enable 'templ1@one.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@one.service " "/etc/systemd/system/templ1@.service"
" $systemctl " --root= " $root " enable 'templ1@two.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@one.service " "/etc/systemd/system/templ1@.service"
islink " $root /etc/systemd/system/services.target.wants/templ1@two.service " "/etc/systemd/system/templ1@.service"
" $systemctl " --root= " $root " disable 'templ1@one.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@one.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@two.service " "/etc/systemd/system/templ1@.service"
" $systemctl " --root= " $root " disable 'templ1@two.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@one.service "
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@two.service "
: -------template enablement w/ default instance--------------
cat >>" $root /etc/systemd/system/templ1@.service " <<EOF
DefaultInstance = 333
EOF
# FIXME: should we deduplicate the target? Right now we warn twice if WantedBy= is repeated.
# WantedBy=services.target services.target
" $systemctl " --root= " $root " enable 'templ1@.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@333.service " "/etc/systemd/system/templ1@.service"
" $systemctl " --root= " $root " enable 'templ1@one.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@333.service " "/etc/systemd/system/templ1@.service"
islink " $root /etc/systemd/system/services.target.wants/templ1@one.service " "/etc/systemd/system/templ1@.service"
" $systemctl " --root= " $root " enable 'templ1@two.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@333.service " "/etc/systemd/system/templ1@.service"
islink " $root /etc/systemd/system/services.target.wants/templ1@one.service " "/etc/systemd/system/templ1@.service"
islink " $root /etc/systemd/system/services.target.wants/templ1@two.service " "/etc/systemd/system/templ1@.service"
" $systemctl " --root= " $root " disable 'templ1@one.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@333.service " "/etc/systemd/system/templ1@.service"
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@one.service "
islink " $root /etc/systemd/system/services.target.wants/templ1@two.service " "/etc/systemd/system/templ1@.service"
# disable both remaining links here
" $systemctl " --root= " $root " disable 'templ1@.service'
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@.service "
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@333.service "
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@one.service "
test ! -h " $root /etc/systemd/system/services.target.wants/templ1@two.service "
2022-03-10 23:33:25 +03:00
: -------template enablement for another template-------------
cat >" $root /etc/systemd/system/templ2@.service " <<EOF
[ Install]
RequiredBy = another-template@.target
EOF
" $systemctl " --root= " $root " enable 'templ2@.service'
islink " $root /etc/systemd/system/another-template@.target.requires/templ2@.service " "/etc/systemd/system/templ2@.service"
" $systemctl " --root= " $root " enable 'templ2@two.service'
islink " $root /etc/systemd/system/another-template@.target.requires/templ2@.service " "/etc/systemd/system/templ2@.service"
islink " $root /etc/systemd/system/another-template@.target.requires/templ2@two.service " "/etc/systemd/system/templ2@.service"
" $systemctl " --root= " $root " disable 'templ2@other.service'
islink " $root /etc/systemd/system/another-template@.target.requires/templ2@.service " "/etc/systemd/system/templ2@.service"
islink " $root /etc/systemd/system/another-template@.target.requires/templ2@two.service " "/etc/systemd/system/templ2@.service"
" $systemctl " --root= " $root " disable 'templ2@two.service'
islink " $root /etc/systemd/system/another-template@.target.requires/templ2@.service " "/etc/systemd/system/templ2@.service"
test ! -h " $root /etc/systemd/system/another-template@.target.requires/templ2@two.service "
" $systemctl " --root= " $root " disable 'templ2@.service'
test ! -h " $root /etc/systemd/system/another-template@.target.requires/templ2@.service "
test ! -h " $root /etc/systemd/system/another-template@.target.requires/templ2@two.service "
2022-03-07 14:15:42 +03:00
: -------aliases w/ and w/o instance--------------------------
test ! -e " $root /etc/systemd/system/link4.service "
cat >" $root /etc/systemd/system/link4.service " <<EOF
[ Install]
2022-03-10 22:26:59 +03:00
Alias = link4.service
2022-03-07 14:15:42 +03:00
Alias = link4@.service
Alias = link4@inst.service
Alias = link4alias.service
Alias = link4alias2.service
EOF
shared/install: return failure when enablement fails, but process as much as possible
So far we'd issue a warning (before this series, just in the logs on the server
side, and before this commit, on stderr on the caller's side), but return
success. It seems that successfull return was introduced by mistake in
aa0f357fd833feecbea6c3e9be80b643e433bced (my fault :( ), which was supposed to
be a refactoring without a functional change. I think it's better to fail,
because if enablement fails, the user will most likely want to diagnose the
issue.
Note that we still do partial enablement, as far as that is possible. So if
e.g. we have [Install] Alias=foo.service foobar, we'll create the symlink
'foo.service', but not 'foobar', since that's not a valid unit name. We'll
print info about the action taken, and about 'foobar' being invalid, and return
failure.
2022-03-10 17:47:12 +03:00
" $systemctl " --root= " $root " enable 'link4.service' && { echo "Expected failure" >& 2; exit 1; }
2022-03-07 14:15:42 +03:00
test ! -h " $root /etc/systemd/system/link4.service " # this is our file
test ! -h " $root /etc/systemd/system/link4@.service "
test ! -h " $root /etc/systemd/system/link4@inst.service "
islink " $root /etc/systemd/system/link4alias.service " "/etc/systemd/system/link4.service"
islink " $root /etc/systemd/system/link4alias2.service " "/etc/systemd/system/link4.service"
" $systemctl " --root= " $root " disable 'link4.service'
test ! -h " $root /etc/systemd/system/link4.service "
test ! -h " $root /etc/systemd/system/link4@.service "
test ! -h " $root /etc/systemd/system/link4@inst.service "
test ! -h " $root /etc/systemd/system/link4alias.service "
test ! -h " $root /etc/systemd/system/link4alias2.service "
: -------systemctl enable on path to unit file----------------
shared/install: return failure when enablement fails, but process as much as possible
So far we'd issue a warning (before this series, just in the logs on the server
side, and before this commit, on stderr on the caller's side), but return
success. It seems that successfull return was introduced by mistake in
aa0f357fd833feecbea6c3e9be80b643e433bced (my fault :( ), which was supposed to
be a refactoring without a functional change. I think it's better to fail,
because if enablement fails, the user will most likely want to diagnose the
issue.
Note that we still do partial enablement, as far as that is possible. So if
e.g. we have [Install] Alias=foo.service foobar, we'll create the symlink
'foo.service', but not 'foobar', since that's not a valid unit name. We'll
print info about the action taken, and about 'foobar' being invalid, and return
failure.
2022-03-10 17:47:12 +03:00
cat >" $root /etc/systemd/system/link4.service " <<EOF
[ Install]
Alias = link4alias.service
Alias = link4alias2.service
EOF
2022-03-07 14:15:42 +03:00
# Apparently this works. I'm not sure what to think.
" $systemctl " --root= " $root " enable '/etc/systemd/system/link4.service'
test ! -h " $root /etc/systemd/system/link4.service " # this is our file
islink " $root /etc/systemd/system/link4alias.service " "/etc/systemd/system/link4.service"
islink " $root /etc/systemd/system/link4alias2.service " "/etc/systemd/system/link4.service"
" $systemctl " --root= " $root " disable '/etc/systemd/system/link4.service'
test ! -h " $root /etc/systemd/system/link4.service "
test ! -h " $root /etc/systemd/system/link4alias.service "
test ! -h " $root /etc/systemd/system/link4alias2.service "
: -------issue 661: link and enable on unit file--------------
test ! -e " $root /etc/systemd/system/link5.service "
cat >" $root /etc/systemd/system/link5.service " <<EOF
[ Install]
2022-03-10 22:26:59 +03:00
Alias = link5.service
2022-03-07 14:15:42 +03:00
Alias = link5alias.service
Alias = link5alias2.service
EOF
" $systemctl " --root= " $root " enable 'link5.service'
test ! -h " $root /etc/systemd/system/link5.service " # this is our file
# FIXME/CLARIFYME: will systemd think that link5alias2, link5alias, link5 are all aliases?
# https://github.com/systemd/systemd/issues/661#issuecomment-1057931149
islink " $root /etc/systemd/system/link5alias.service " "/etc/systemd/system/link5.service"
islink " $root /etc/systemd/system/link5alias2.service " "/etc/systemd/system/link5.service"
" $systemctl " --root= " $root " disable 'link5.service'
test ! -h " $root /etc/systemd/system/link5alias.service "
test ! -h " $root /etc/systemd/system/link5alias2.service "
: ----issue 19437: plain templates in .wants/ or .requires/---
test ! -e " $root /etc/systemd/system/link5@.path "
cat >" $root /etc/systemd/system/link5@.path " <<EOF
[ Install]
WantedBy = target5@.target
RequiredBy = target5@.target
WantedBy = target5@inst.target
RequiredBy = target5@inst.target
EOF
" $systemctl " --root= " $root " enable 'link5@.path'
test ! -h " $root /etc/systemd/system/link5@.path " # this is our file
islink " $root /etc/systemd/system/target5@.target.wants/link5@.path " "/etc/systemd/system/link5@.path"
islink " $root /etc/systemd/system/target5@.target.requires/link5@.path " "/etc/systemd/system/link5@.path"
islink " $root /etc/systemd/system/target5@inst.target.wants/link5@.path " "/etc/systemd/system/link5@.path"
islink " $root /etc/systemd/system/target5@inst.target.requires/link5@.path " "/etc/systemd/system/link5@.path"
" $systemctl " --root= " $root " disable 'link5@.path'
test ! -h " $root /etc/systemd/system/link5@.path " # this is our file
test ! -h " $root /etc/systemd/system/target5@.target.wants/link5@.path "
test ! -h " $root /etc/systemd/system/target5@.target.requires/link5@.path "
test ! -h " $root /etc/systemd/system/target5@inst.target.wants/link5@.path "
test ! -h " $root /etc/systemd/system/target5@inst.target.requires/link5@.path "
: -------removal of symlinks not listed in [ Install] ----------
# c.f. 66a19d85a533b15ed32f4066ec880b5a8c06babd
test ! -e " $root /etc/systemd/system/multilink.mount "
cat >" $root /etc/systemd/system/multilink.mount " <<EOF
[ Install]
WantedBy = multilink.target
EOF
mkdir -p " $root /etc/systemd/system/default.target.wants "
ln -s ../multilink.mount " $root /etc/systemd/system/default.target.wants/ "
ln -s ../multilink.mount " $root /etc/systemd/system/multilink-alias.mount "
ln -s ../multilink.mount " $root /etc/systemd/system/multilink-badalias.service "
" $systemctl " --root= " $root " disable 'multilink.mount'
test -e " $root /etc/systemd/system/multilink.mount " # this is our file
test ! -h " $root /etc/systemd/system/default.target.wants/ "
test ! -h " $root /etc/systemd/system/multilink-alias.mount "
test ! -h " $root /etc/systemd/system/multilink-badalias.service "
: -------merge 20017: specifiers in the unit file-------------
test ! -e " $root /etc/systemd/system/some-some-link6@.socket "
# c.f. de61a04b188f81a85cdb5c64ddb4987dcd9d30d3
check_alias( ) {
: ------------------ %$1 -------------------------------------
cat >" $root /etc/systemd/system/some-some-link6@.socket " <<EOF
[ Install]
Alias = target@$1 :%$1 .socket
EOF
SYSTEMD_LOG_LEVEL = debug " $systemctl " --root= " $root " enable 'some-some-link6@.socket' || return 1
islink " $root /etc/systemd/system/target@ $1 : $2 .socket " "/etc/systemd/system/some-some-link6@.socket" || return 2
}
check_alias a " $( uname -m | tr '_' '-' ) "
2022-03-08 14:08:00 +03:00
test ! -e " $root /etc/os-release "
test ! -e " $root /usr/lib/os-release "
check_alias A '' && { echo "Expected failure" >& 2; exit 1; }
check_alias B '' && { echo "Expected failure" >& 2; exit 1; }
check_alias M '' && { echo "Expected failure" >& 2; exit 1; }
check_alias o '' && { echo "Expected failure" >& 2; exit 1; }
check_alias w '' && { echo "Expected failure" >& 2; exit 1; }
check_alias W '' && { echo "Expected failure" >& 2; exit 1; }
cat >" $root /etc/os-release " <<EOF
# empty
EOF
2022-03-07 14:15:42 +03:00
2022-03-08 14:08:00 +03:00
check_alias A ''
check_alias B ''
check_alias M ''
check_alias o ''
check_alias w ''
check_alias W ''
cat >" $root /etc/os-release " <<EOF
ID = 'the-id'
VERSION_ID = 39a
BUILD_ID = build-id
VARIANT_ID = wrong
VARIANT_ID = right
IMAGE_ID = "foobar"
IMAGE_VERSION = '1-2-3'
EOF
2022-03-07 14:15:42 +03:00
2022-03-08 14:08:00 +03:00
check_alias A '1-2-3'
check_alias B 'build-id'
check_alias M 'foobar'
check_alias o 'the-id'
check_alias w '39a'
check_alias W 'right'
check_alias b " $( systemd-id128 boot-id) "
2022-03-07 14:15:42 +03:00
2022-03-09 18:06:24 +03:00
# Specifiers not available for [Install]
check_alias C '' && { echo "Expected failure" >& 2; exit 1; }
check_alias E '' && { echo "Expected failure" >& 2; exit 1; }
check_alias f '' && { echo "Expected failure" >& 2; exit 1; }
check_alias h '' && { echo "Expected failure" >& 2; exit 1; }
check_alias I '' && { echo "Expected failure" >& 2; exit 1; }
check_alias J '' && { echo "Expected failure" >& 2; exit 1; }
check_alias L '' && { echo "Expected failure" >& 2; exit 1; }
check_alias P '' && { echo "Expected failure" >& 2; exit 1; }
check_alias s '' && { echo "Expected failure" >& 2; exit 1; }
check_alias S '' && { echo "Expected failure" >& 2; exit 1; }
check_alias t '' && { echo "Expected failure" >& 2; exit 1; }
check_alias T '' && { echo "Expected failure" >& 2; exit 1; }
check_alias V '' && { echo "Expected failure" >& 2; exit 1; }
2022-03-07 14:15:42 +03:00
shared/specifier: fix %u/%U/%g/%G when called as unprivileged user
We would resolve those specifiers to the calling user/group. This is mostly OK
when done in the manager, because the manager generally operates as root
in system mode, and a non-root in user mode. It would still be wrong if
called with --test though. But in systemctl, this would be generally wrong,
since we can call 'systemctl --system' as a normal user, either for testing
or even for actual operation with '--root=…'.
When operating in --global mode, %u/%U/%g/%G should return an error.
The information whether we're operating in system mode, user mode, or global
mode is passed as the data pointer to specifier_group_name(), specifier_user_name(),
specifier_group_id(), specifier_user_id(). We can't use userdata, because
it's already used for other things.
2022-03-10 00:29:19 +03:00
check_alias g root
check_alias G 0
check_alias u root
check_alias U 0
2022-03-07 14:15:42 +03:00
check_alias i ""
check_alias j 'link6'
check_alias l " $( uname -n | sed 's/\..*//' ) "
2022-03-08 14:08:00 +03:00
test ! -e " $root /etc/machine-id "
check_alias m '' && { echo "Expected failure" >& 2; exit 1; }
2022-03-07 14:15:42 +03:00
2022-03-08 14:08:00 +03:00
systemd-id128 new >" $root /etc/machine-id "
check_alias m " $( cat " $root /etc/machine-id " ) "
2022-03-07 14:15:42 +03:00
check_alias n 'some-some-link6@.socket'
check_alias N 'some-some-link6@'
check_alias p 'some-some-link6'
check_alias v " $( uname -r) "
check_alias % '%' && { echo "Expected failure because % is not legal in unit name" >& 2; exit 1; }
check_alias z 'z' && { echo "Expected failure because %z is not known" >& 2; exit 1; }
2022-03-10 23:33:25 +03:00
: -------specifiers in WantedBy-------------------------------
# We don't need to repeat all the tests. Let's do a basic check that specifier
# expansion is performed.
cat >" $root /etc/systemd/system/some-some-link7.socket " <<EOF
[ Install]
WantedBy = target@%p.target
WantedBy = another-target@.target
RequiredBy = target2@%p.target
RequiredBy = another-target2@.target
EOF
" $systemctl " --root= " $root " enable 'some-some-link7.socket'
islink " $root /etc/systemd/system/target@some-some-link7.target.wants/some-some-link7.socket " "/etc/systemd/system/some-some-link7.socket"
islink " $root /etc/systemd/system/another-target@.target.wants/some-some-link7.socket " "/etc/systemd/system/some-some-link7.socket"
islink " $root /etc/systemd/system/target2@some-some-link7.target.requires/some-some-link7.socket " "/etc/systemd/system/some-some-link7.socket"
islink " $root /etc/systemd/system/another-target2@.target.requires/some-some-link7.socket " "/etc/systemd/system/some-some-link7.socket"
" $systemctl " --root= " $root " disable 'some-some-link7.socket'
test ! -h " $root /etc/systemd/system/target@some-some-link7.target.wants/some-some-link7.socket "
test ! -h " $root /etc/systemd/system/another-target@.target.wants/some-some-link7.socket "
test ! -h " $root /etc/systemd/system/target2@some-some-link7.target.requires/some-some-link7.socket "
test ! -h " $root /etc/systemd/system/another-target2@.target.requires/some-some-link7.socket "
2022-03-07 14:15:42 +03:00
# TODO: repeat the tests above for presets
2022-03-07 20:54:50 +03:00
: -------SYSTEMD_OS_RELEASE relative to root------------------
# check that os-release overwriting works as expected with root
test -e " $root /etc/os-release "
cat >" $root /etc/os-release2 " <<EOF
ID = 'the-id2'
EOF
SYSTEMD_OS_RELEASE = " $root /etc/os-release2 " check_alias o 'the-id2'