| #!/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\|target\.wants\|path\|timer\|snapshot\)\s*$' |
| 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 |