#!/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\)\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
