www.nico.schottelius.org/software/cinit/browse_source/cinit-0.3pre16/bin/cinit-conf.svc.dependency.add
Nico Schottelius 0c13ed6979 add cinit-0.3pre16
Signed-off-by: Nico Schottelius <nico@ikn.schottelius.org>
2009-09-29 21:36:27 +02:00

120 lines
3.4 KiB
Bash
Executable file

#!/bin/sh
#
# 2008 Nico Schottelius (nico-cinit-conf at schottelius.org)
#
# This file is part of cinit-conf.
#
# cinit-conf is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cinit-conf is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cinit-conf. If not, see <http://www.gnu.org/licenses/>.
#
# cinit: create dependency: service a needs or wants service b
#
set -x
# initialise cinit-conf framework
hier="${0%/*}"; set -e; . "${hier}/cinit-conf.read-conf"
if [ $# -ne 3 ]; then
echo "`basename $0`: service_A [wants|needs] service_B"
echo ""
echo " Service A needs or wants Service B."
echo " You must specify whether to use wants or needs."
echo ""
exit 23
fi
SVC_A="$1"
DEP="$2"
SVC_B="$3"
# adding 'wishes' for x-mas and requires for 'the mass' and 'tv'
case "${DEP}" in
wishes|wants) DEP="$C_WANTS" ;;
needs|requires) DEP="$C_NEEDS" ;;
*) echo "Use \"want\" or \"need\" as type of dependency."
esac
# First of all create absolute paths
# if SVC_X beginning matches R_CINIT_DIR it is absolute
# else it is relative to R_CINIT_DIR
echo "${SVC_A}" | grep "^${R_SVC_DIR}" >/dev/null || SVC_A="${R_SVC_DIR}/${SVC_A}"
echo "${SVC_B}" | grep "^${R_SVC_DIR}" >/dev/null || SVC_B="${R_SVC_DIR}/${SVC_B}"
SVC_A_ABS=$(cd "${SVC_A}" && pwd -P)
SVC_B_ABS=$(cd "${SVC_B}" && pwd -P)
SVC_A_REL="${SVC_A_ABS##*/}"
SVC_B_REL="${SVC_B_ABS##*/}"
set +e
match=""
count="0"
svc_stripped="$(echo $SVC_A_ABS | sed -e 's;/$;;' -e 's;/[^/]*$;;')"
while [ "$svc_stripped" ]; do
match="$(echo ${SVC_B_ABS} | grep "^${svc_stripped}")"
count=$(($count+1))
if [ "$match" ]; then
relpath=""
while [ "$count" -gt 0 ]; do
source="../${source}"
count=$(($count-1))
done
source="${source}${SVC_B_REL}"
break
fi
svc_stripped="$(echo $svc_stripped | sed -e 's;/$;;' -e 's;/[^/]*$;;')"
done
# nothing in common? link absolute
if [ ! "$match" ]; then
source="${SVC_B_ABS}"
fi
# Then find out the level of subdirs, excluding destdir!
# FIXME: could someone PLEASE simplify that?
#SLASHES=$(echo $SVC_A | sed -e 's,/$,,' -e 's,[^/],,g' -e 's,/,../,g' -e 's,^,../../,')
# find common anchor and link after that:
# /destdir/etc/cinit/svc/svca/b/
# /destdir/etc/cinit/svc/svca/c/
# results in ../c/
# Thus:
# while unmatched
# remove /* (one level, shortest match)
#
# 1. remove destdir, if present 2. remove everything but the slashes 3. replace them with ../
#
SLASHES=$(echo $SVC_A | sed -e "s;^$DESTDIR;;" -e 's,/$,,' -e 's,[^/],,g' -e 's,/,../,g' -e 's,^,../../,')
DEST_NAME=$(echo $SVC_A | sed -e 's,/$,,' -e 's,/,-,g')
SOURCE="${SLASHES}${SVC_B}"
DEP_DIR="${SVC_A}/${DEP}"
if [ ! -d "$DEP_DIR" ]; then
echo "$DEP_DIR does not exist, creating..."
mkdir "$DEP_DIR"
if [ $? -ne 0 ]; then
echo "Error occured due to creating directory. Exiting."
exit 1
fi
fi
DEST="${DEP_DIR}/${DEST_NAME}"
echo -n "Linking ${source} to ${DEST} ... "
ln -sf "${source}" "${DEST}"
echo "finished."