#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
NAME=`basename $0`
BINDIR=/opt/pgpro/std-15/bin
MANDIR=/opt/pgpro/std-15/share/man
MANSUF=.gz
# List of possible names of man.config in the various distributions
MAN_CONFIGS="/etc/manpath.config /etc/man_db.conf /etc/man.config"

USAGE_STRING="Usage: $0 links (update|remove)"

make_ua_path() {
    if [ -x /usr/sbin/update-alternatives ]; then
	echo /usr/sbin/update-alternatives
    else
	if [ -x /usr/bin/update-alternatives ]; then
	    echo /usr/bin/update-alternatives
	else
	    echo /sbin/update-alternatives
	fi
    fi
}

update_man_config() {
    for config in $MAN_CONFIGS; do
    	[ -f "$config" ] || continue
	if ! grep $MANDIR "$config" >/dev/null; then
	    echo "Updating $config"
	    if [ "$config" = "/etc/man.config" ]; then
		echo "MANPATH $MANDIR" >> "$config"
	    else
		echo "MANDATORY_MANPATH $MANDIR" >> "$config"
	    fi
	fi
    done
}

cleanup_man_config() {
    for config in $MAN_CONFIGS; do
    	[ -f "$config" ] || continue
	if grep $MANDIR "$config" >/dev/null; then
	    echo "Updating $config"
	    MANDIR_PATTERN=`echo $MANDIR | sed -e 's,\/,\\\/,g'`
	    if [ "$config" = "/etc/man.config" ]; then
		sed -i.bak "/MANPATH $MANDIR_PATTERN/d" "$config" && rm -f "${config}.bak"
	    else
		sed -i.bak "/MANDATORY_MANPATH $MANDIR_PATTERN/d" "$config" && rm -f "${config}.bak"
	    fi
	fi
    done
}

update_links() {
    BINLIST=`ls $BINDIR`
    MAN1LIST=`ls $MANDIR/man1`
    MAN1RULIST=`ls $MANDIR/ru/man1`
    UA=`make_ua_path`
    if [ -x $UA ] && [ ! "`realpath $UA 2>/dev/null`" = "/bin/true" ]; then
	man_installed=0
	for name in $BINLIST; do
	    $UA --install /usr/bin/$name pgsql-${name} $BINDIR/pg-wrapper 1500
	done
	for name in $MAN1LIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    $UA --install /usr/share/man/man1/${name}.1${MANSUF} pgsql-${name}man $MANDIR/man1/${name}.1${MANSUF} 1500 && man_installed=1
	done
	
	if [ ! -d /usr/share/man/ru/man1 ]; then
	    mkdir -p /usr/share/man/ru/man1
	fi
	for name in $MAN1RULIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    $UA --install /usr/share/man/ru/man1/${name}.1${MANSUF} pgsql-${name}manru $MANDIR/ru/man1/${name}.1${MANSUF} 1500
	done

	if [ $man_installed -eq 1 ]; then
	    update_man_config
	fi
    else
	bin_ready=1
	man_ready=1
	man_ru_ready=1
	for name in $BINLIST; do
	    if [ -f /usr/bin/$name ] && [ ! -L /usr/bin/$name ]; then
		echo "Warning: skipping binary link setup. Binary file already exists: /usr/bin/$name"
		bin_ready=0
	    fi
	done
	for name in $MAN1LIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    if [ -f /usr/share/man/man1/${name}.1${MANSUF} ] && [ ! -L /usr/share/man/man1/${name}.1${MANSUF} ]; then
		echo "Warning: skipping man page setup. Man page with the same name already exists: /usr/share/man/man1/${name}.1${MANSUF}"
		man_ready=0
	    fi
	done
	for name in $MAN1RULIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    if [ -f /usr/share/man/ru/man1/${name}.1${MANSUF} ] && [ ! -L /usr/share/man/ru/man1/${name}.1${MANSUF} ]; then
		echo "Warning: skipping man page setup. Man page with the same name already exists: /usr/share/man/ru/man1/${name}.1${MANSUF}"
		man_ru_ready=0
	    fi
	done
	if [ $bin_ready -eq 1 ] && [ $man_ready -eq 1 ] && [ $man_ru_ready -eq 1 ]; then
	    for name in $BINLIST; do
		echo "Creating link for /usr/bin/$name"
		ln -snf $BINDIR/pg-wrapper /usr/bin/$name
	    done
	    for name in $MAN1LIST; do
		name=`echo $name | sed -e 's/\.1.*//g'`
		echo "Creating link for /usr/share/man/man1/${name}.1${MANSUF}"
		ln -snf $MANDIR/man1/${name}.1${MANSUF} /usr/share/man/man1/${name}.1${MANSUF}
	    done
	    if [ ! -d /usr/share/man/ru/man1 ]; then
		mkdir -p /usr/share/man/ru/man1
	    fi
	    for name in $MAN1RULIST; do
		name=`echo $name | sed -e 's/\.1.*//g'`
		echo "Creating link for /usr/share/man/ru/man1/${name}.1${MANSUF}"
		ln -snf $MANDIR/ru/man1/${name}.1${MANSUF} /usr/share/man/ru/man1/${name}.1${MANSUF}
	    done
	    
	    update_man_config
	fi
    fi
}

remove_links() {
    BINLIST=`ls $BINDIR`
    MAN1LIST=`ls $MANDIR/man1`
    MAN1RULIST=`ls $MANDIR/ru/man1`
    UA=`make_ua_path`
    if [ -x $UA ] && [ ! "`realpath $UA`" = "/bin/true" ] 2>/dev/null; then
	for name in $BINLIST; do
	    $UA --remove pgsql-$name $BINDIR/pg-wrapper
	done
	for name in $MAN1LIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    $UA --remove pgsql-${name}man $MANDIR/man1/${name}.1${MANSUF}
	done
	for name in $MAN1RULIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    $UA --remove pgsql-${name}manru $MANDIR/ru/man1/${name}.1${MANSUF}
	done
    else
	PGHOME=`/usr/bin/dirname $BINDIR`
	for name in $BINLIST; do
	    if [ -L /usr/bin/$name ] ; then
		path=`readlink /usr/bin/$name`
		if echo $path | grep $PGHOME >/dev/null; then
		    echo "Removing link for /usr/bin/$name"
		    rm -f /usr/bin/$name
		fi
	    fi
	done
	for name in $MAN1LIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    if [ -L /usr/share/man/man1/${name}.1${MANSUF} ] ; then
		path=`readlink /usr/share/man/man1/${name}.1${MANSUF}`
		if echo $path | grep $PGHOME >/dev/null; then
		    echo "Removing link for /usr/share/man/man1/${name}.1${MANSUF}"
		    rm -f /usr/share/man/man1/${name}.1${MANSUF}
		fi
	    fi
	done
	for name in $MAN1RULIST; do
	    name=`echo $name | sed -e 's/\.1.*//g'`
	    if [ -L /usr/share/man/ru/man1/${name}.1 ] ; then
		path=`readlink /usr/share/man/ru/man1/${name}.1${MANSUF}`
		if echo $path | grep $PGHOME >/dev/null; then
		    echo "Removing link for /usr/share/man/ru/man1/${name}.1${MANSUF}"
		    rm -f /usr/share/man/ru/man1/${name}.1${MANSUF}
		fi
	    fi
	done
    fi

    cleanup_man_config

}

links() {
    case "$1" in
	update)
	    shift
	    update_links $@
	    ;;
	remove)
	    shift
	    remove_links $@
	    ;;
	*)
            echo >&2 "$USAGE_STRING"
            exit 2
    esac
}

if [ -z "$NAME" ]; then
    echo "Error: failed to extract basename of $0"
    exit 1
fi

if [ "$NAME" = "pg-wrapper" ]; then
    case "$1" in
	links)
	    shift
		if [ $(id -u) -ne 0 ]; then
			echo "Links management requires root privileges" >&2
			exit 1;
		fi
	    links $@
	    ;;
	*)
            echo >&2 "$USAGE_STRING"
            exit 2
    esac
else
    exec $BINDIR/$NAME ${1:+"$@"}
fi
