#!/bin/sh
# Script:        rsfklink
#
#                $Id$
#
# Author:        High-Availability.Com Ltd
#
# Platform:      UNIX
#
# Description:   Creates symbolic kill script links back to start scripts.
#

PREFIX=${BASEDIR:-/}
case ${PREFIX} in
    */)
	. ${PREFIX}opt/HAC/bin/rsf.sh
	;;

    *)
	. ${PREFIX}/opt/HAC/bin/rsf.sh
	;;
esac

script="`basename $0`"
ls="/bin/ls -1"

print_help() {
    cat <<EOF
Usage: ${script} [options] [<service|directory>]...
Options (which cannot be combined: use -d -q, not -dq) are:
  -d	Debug - enable extra debugging printout.
  -h	Help - print this help text and exit.
  -n	No processing - print commands, don't execute them.
  -q	Quiet - work silently, don't show what is being done.
EOF
}

# Usage: invert_filename <name> [<prefix>]
# 'invert' a filename, from xNNyyy to prefix(100-NN)yyy, where x is any
# single character, NN is a 2 digit decimal number, and yyy is a suffix
# string. If not prefix is specified, prefix of 'K' is assumed. e.g.
#	`invert_filename S01announce` -> K99announce
#	`invert_filename P33action U` -> U67action
#
# Exits OK if a name was inverted, error if not
#
invert_filename() {
    echo "$1" | awk '/^.[0-9][0-9]/ { X=0; \
	printf("%s%02d%s\n", PREFIX, 100-substr($0,2,2), substr($0,4)) } \
	END { exit(X) }' X=1 PREFIX="${2-K}"
}

# Make shutdown links for all the startup files in a directory
process_directory() {
    $SAY "[Processing directory $1]"
    (cd "$1"
	$DEBUG echo "cd '$1'"
	for filename in S[0-9][0-9]*; do
	    if invname=`invert_filename "$filename"`; then
		# Clobber any existing kill script link
		if [ -h "$invname" ]; then
		    $DO rm -f "$invname"
		fi

		# File does not exist so link to it (remember the
		# above test only removes files that are linked).
		if [ -f "$invname" ]; then
		    $SAY "Not linking '$filename', '$invname' is NOT a link"
		else
		    $DO ln -s "$filename" "$invname"
		fi
	    fi
	done
    )
}

# Process a list of service names or directories
process_list() {
    for item in "$@"; do
	$DEBUG echo "${script}: process_list processing item $item"
	if [ -d "$item" ]; then
	    process_directory "$item"
	else
	    if [ -d "${PRODUCT_DIR}/etc/rc.$item.d" ]; then
		process_directory "${PRODUCT_DIR}/etc/rc.$item.d"
	    else
		echo "${script}: No directory for $item, skipping"
	    fi
	fi
    done
}

DEBUG=:
SAY="echo ${script}:"
DO=""
while true; do
    case "$1" in
	-d)
	    DEBUG=""
	    DO=:
	    shift
	    ;;
	-h)
	    print_help
	    shift
	    exit 1
	    ;;
	-n)
	    DO=echo
	    shift
	    ;;
	-q)
	    SAY=:
	    shift
	    ;;
	-*)
	    echo "Unknown option $1, use ${script} -h for help."
	    exit 1
	    shift
	    ;;
	*)
	    break
	    ;;
    esac
done


if [ $# -ge 1 ]; then
    # User specified directories or services
    process_list "$@"
elif [ -f "${PRODUCT_DIR}/etc/config" ]; then
    # Find SERVICE definitions in config file
    process_list `awk '$1 ~ /^SERVICE$/ { print $2 }' ${PRODUCT_DIR}/etc/config`
else
    # Find rc.service.d service script directories
    process_list ${PRODUCT_DIR}/etc/rc.*.d
fi
