mirror of
git://git.yoctoproject.org/poky
synced 2026-09-05 01:46:03 +00:00
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>
196 lines
5.2 KiB
Bash
Executable File
196 lines
5.2 KiB
Bash
Executable File
#!/bin/sh
|
|
echo "Started $0 $*"
|
|
|
|
ROOT=
|
|
|
|
# parse command line params
|
|
action=
|
|
while [ $# != 0 ]; do
|
|
opt="$1"
|
|
|
|
case "$opt" in
|
|
enable)
|
|
shift
|
|
|
|
action="$opt"
|
|
services="$1"
|
|
cmd_args="1"
|
|
shift
|
|
;;
|
|
disable)
|
|
shift
|
|
|
|
action="$opt"
|
|
services="$1"
|
|
cmd_args="1"
|
|
shift
|
|
;;
|
|
mask)
|
|
shift
|
|
|
|
action="$opt"
|
|
services="$1"
|
|
cmd_args="1"
|
|
shift
|
|
;;
|
|
preset)
|
|
shift
|
|
|
|
action="$opt"
|
|
services="$1"
|
|
cmd_args="1"
|
|
shift
|
|
;;
|
|
--root=*)
|
|
ROOT=${opt##--root=}
|
|
cmd_args="0"
|
|
shift
|
|
;;
|
|
*)
|
|
if [ "$cmd_args" = "1" ]; then
|
|
services="$services $opt"
|
|
shift
|
|
else
|
|
echo "'$opt' is an unkown option; exiting with error"
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
if [ "$action" = "preset" -a "$service_file" = "" ]; then
|
|
services=$(for f in `find $ROOT/etc/systemd/system $ROOT/lib/systemd/system $ROOT/usr/lib/systemd/system -type f 2>1`; do basename $f; done)
|
|
services="$services $opt"
|
|
presetall=1
|
|
fi
|
|
|
|
for service in $services; do
|
|
if [ "$presetall" = "1" ]; then
|
|
action="preset"
|
|
fi
|
|
if [ "$action" = "mask" ]; then
|
|
if [ ! -d $ROOT/etc/systemd/system/ ]; then
|
|
mkdir -p $ROOT/etc/systemd/system/
|
|
fi
|
|
cmd="ln -s /dev/null $ROOT/etc/systemd/system/$service"
|
|
echo "$cmd"
|
|
$cmd
|
|
exit 0
|
|
fi
|
|
|
|
service_base_file=`echo $service | sed 's/\(@\).*\(\.[^.]\+\)/\1\2/'`
|
|
if [ -z `echo $service | sed '/@/p;d'` ]; then
|
|
echo "Try to find location of $service..."
|
|
service_template=false
|
|
else
|
|
echo "Try to find location of template $service_base_file of instance $service..."
|
|
service_template=true
|
|
if [ -z `echo $service | sed 's/^.\+@\(.*\)\.[^.]\+/\1/'` ]; then
|
|
instance_specified=false
|
|
else
|
|
instance_specified=true
|
|
fi
|
|
fi
|
|
|
|
# find service file
|
|
for p in $ROOT/etc/systemd/system \
|
|
$ROOT/lib/systemd/system \
|
|
$ROOT/usr/lib/systemd/system; do
|
|
if [ -e $p/$service_base_file ]; then
|
|
service_file=$p/$service_base_file
|
|
service_file=${service_file##$ROOT}
|
|
fi
|
|
done
|
|
if [ -z "$service_file" ]; then
|
|
echo "'$service_base_file' couldn't be found; exiting with error"
|
|
exit 1
|
|
fi
|
|
echo "Found $service in $service_file"
|
|
|
|
# If any new unit types are added to systemd they should be added
|
|
# to this regular expression.
|
|
unit_types_re='\.\(service\|socket\|device\|mount\|automount\|swap\|target\|path\|timer\|snapshot\)$'
|
|
if [ "$action" = "preset" ]; then
|
|
action=`egrep -sh $service $ROOT/etc/systemd/user-preset/*.preset | cut -f1 -d' '`
|
|
if [ -z "$action" ]; then
|
|
globalpreset=`egrep -sh '\*' $ROOT/etc/systemd/user-preset/*.preset | cut -f1 -d' '`
|
|
if [ -n "$globalpreset" ]; then
|
|
action="$globalpreset"
|
|
else
|
|
action="enable"
|
|
fi
|
|
fi
|
|
fi
|
|
# create the required symbolic links
|
|
wanted_by=$(sed '/^WantedBy[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
|
|
| tr ',' '\n' \
|
|
| grep "$unit_types_re")
|
|
|
|
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
|
|
alias=$(sed '/^Alias[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
|
|
| tr ',' '\n' \
|
|
| grep "$unit_types_re")
|
|
|
|
for r in $alias; do
|
|
if [ "$action" = "enable" ]; then
|
|
mkdir -p $ROOT/etc/systemd/system
|
|
ln -s $service_file $ROOT/etc/systemd/system/$r
|
|
echo "Enabled $service for $alias."
|
|
else
|
|
rm -f $ROOT/etc/systemd/system/$r
|
|
echo "Disabled $service for $alias."
|
|
fi
|
|
done
|
|
|
|
# call us for the other required scripts
|
|
also=$(sed '/^Also[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \
|
|
| tr ',' '\n')
|
|
for a in $also; do
|
|
echo "Also=$a found in $service"
|
|
if [ "$action" = "enable" ]; then
|
|
$0 --root=$ROOT enable $a
|
|
fi
|
|
done
|
|
done
|