systemctl: handle RequiredBy dependencies

Install section of a systemd service may contain RequiredBy dependency,
which is not handled currently. This means that symlinks to enable the
service are not created and the service may not be started.

Also fix debug output (all dependencies were printed instead of the one
which was enabled or disabled).

(From OE-Core rev: 6f4d9d9675ce39f5154de30b2921ada019a93d0f)

Signed-off-by: Tomas Novotny <tomas@novotny.cz>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Tomas Novotny 2016-02-26 15:57:40 +01:00 committed by Richard Purdie
parent 8caa5921da
commit b33efa964a
1 changed files with 39 additions and 26 deletions

View File

@ -125,33 +125,46 @@ for service in $services; do
| tr ',' '\n' \
| grep "$unit_types_re")
for r in $wanted_by; do
echo "WantedBy=$r found in $service"
if [ "$action" = "enable" ]; then
enable_service=$service
if [ "$service_template" = true -a "$instance_specified" = false ]; then
default_instance=$(sed '/^DefaultInstance[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file")
if [ -z $default_instance ]; then
echo "Template unit without instance or DefaultInstance directive, nothing to enable"
continue
else
echo "Found DefaultInstance $default_instance, enabling it"
enable_service=$(echo $service | sed "s/@/@$(echo $default_instance | sed 's/\\/\\\\/g')/")
fi
fi
mkdir -p $ROOT/etc/systemd/system/$r.wants
ln -s $service_file $ROOT/etc/systemd/system/$r.wants/$enable_service
echo "Enabled $enable_service for $wanted_by."
else
if [ "$service_template" = true -a "$instance_specified" = false ]; then
disable_service="$ROOT/etc/systemd/system/$r.wants/`echo $service | sed 's/@/@*/'`"
else
disable_service="$ROOT/etc/systemd/system/$r.wants/$service"
fi
rm -f $disable_service
[ -d $ROOT/etc/systemd/system/$r.wants ] && rmdir --ignore-fail-on-non-empty -p $ROOT/etc/systemd/system/$r.wants
echo "Disabled ${disable_service##$ROOT/etc/systemd/system/$r.wants/} for $wanted_by."
required_by=$(sed '/^RequiredBy[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
| tr ',' '\n' \
| grep "$unit_types_re")
for dependency in WantedBy RequiredBy; do
if [ "$dependency" = "WantedBy" ]; then
suffix="wants"
dependency_list="$wanted_by"
elif [ "$dependency" = "RequiredBy" ]; then
suffix="requires"
dependency_list="$required_by"
fi
for r in $dependency_list; do
echo "$dependency=$r found in $service"
if [ "$action" = "enable" ]; then
enable_service=$service
if [ "$service_template" = true -a "$instance_specified" = false ]; then
default_instance=$(sed '/^DefaultInstance[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file")
if [ -z $default_instance ]; then
echo "Template unit without instance or DefaultInstance directive, nothing to enable"
continue
else
echo "Found DefaultInstance $default_instance, enabling it"
enable_service=$(echo $service | sed "s/@/@$(echo $default_instance | sed 's/\\/\\\\/g')/")
fi
fi
mkdir -p $ROOT/etc/systemd/system/$r.$suffix
ln -s $service_file $ROOT/etc/systemd/system/$r.$suffix/$enable_service
echo "Enabled $enable_service for $r."
else
if [ "$service_template" = true -a "$instance_specified" = false ]; then
disable_service="$ROOT/etc/systemd/system/$r.$suffix/`echo $service | sed 's/@/@*/'`"
else
disable_service="$ROOT/etc/systemd/system/$r.$suffix/$service"
fi
rm -f $disable_service
[ -d $ROOT/etc/systemd/system/$r.$suffix ] && rmdir --ignore-fail-on-non-empty -p $ROOT/etc/systemd/system/$r.$suffix
echo "Disabled ${disable_service##$ROOT/etc/systemd/system/$r.$suffix/} for $r."
fi
done
done
# create the required symbolic 'Alias' links