mirror of
git://git.yoctoproject.org/poky
synced 2026-09-01 04:06:45 +00:00
Template unit files (those with '@' in their names) are not handled with native version of systemctl. This is usually not a problem, as the native systemctl fails and systemctl command is executed during first boot. But some early boot template units may fail during first boot because opkg configure for first boot is pulled too late for them (although I encouter it only with some of my services, not with oe-core ones). Handling of template unit files is same as in original systemctl. Also DefaultInstance directive in template is respected. As with original systemctl, enabling of template without instance and DefaultInstance does nothing. (From OE-Core rev: 90904ef3bab182a46174f7bb60e83f0f22a3f209) 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>
183 lines
4.7 KiB
Bash
Executable File
183 lines
4.7 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")
|
|
|
|
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/@/@$default_instance/")
|
|
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
|
|
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."
|
|
fi
|
|
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
|