#!/bin/sh
#################################################################
#
# /usr/X11R6/bin/varkon
#
# Startscript for debianized version of VARKON-1.17A
#
# Heavily modified from the original varkon startscript
# by Stephan Helma and released under GPL to the public.
#
#################################################################

SYSINI=/etc/varkon/varkonrc
USERINI=$HOME/.varkon/varkonrc
VARKON_CMD=""

ask_create()
{
    ans=""
    while [ "$ans" != "y" -a "$ans" != "n" ] ; do
	if [ "$ans" ] ; then echo "Please answer either \`y\' or \`n\'"; fi
	echo "The directory where varkon stores the $2 does not exist."
	echo -e "\t$1"
	echo -n "Shall I create it? [Y|n] " > /dev/tty
	read ans < /dev/tty
	ans="`echo $ans | tr A-Z a-z`"
	ans=${ans:-y}
    done
    if [ "$ans" = "y" ] ; then
	mkdir -p $1
    else
	echo Terminating...
	exit 2
    fi
}

cp_example()
{
    for project in `ls /usr/doc/varkon/examples/app/`; do
	# Does the project dir already exist?
	if -d /$VARKON_PRD/$project; then
	    echo Omittin '$project' which seems to exist in $VARKON_PRD
	else
	    # Does the PID file exist?
	    if -f /usr/doc/varkon/examples/pid/$project.PID; then
		# Copy and unzip all project related files
		mkdir /$VARKON_PRD/$project
		cp -r /usr/doc/varkon/examples/app/$project/* /$VARKON_PRD/$project
		gunzip /$VARKON_PRD/$project/*/

		# Copy and tweak PID file
		cat /usr/doc/varkon/examples/pid/$project.PID | sed -e "s/VARKON_ROOT\/app/VARKON_PRD/" > /$VARKON_PID/$project.PID

	    else
		echo Omitting '$project' due to missing PID file
	    fi
	fi
    done
}

ask_example()
{
    ans=""
    while [ "$ans" != "y" -a "$ans" != "n" ] ; do
	if [ "$ans" ] ; then echo "Please answer either \`y\' or \`n\'"; fi
	echo "It seems that you are running VARKON for the first time."
	echo -n "Shall I copy the examples to your VARKON directory? [Y|n] " > /dev/tty
	read ans < /dev/tty
	ans="`echo $ans | tr A-Z a-z`"
	ans=${ans:-y}
    done
    if [ "$ans" = "y" ] ; then
	cp_example
    fi
}

# Sorry, this is a bit lengthy
config_ini()
{
# VARKON's own defaults
VRK_MBS_EMULATOR="xterm -title MBS-Edit -e"
VRK_MBS_EDITOR=vi
VRK_HTML_VIEWER=netscape

error()
{
    echo
    echo ERROR: $1! Exiting...
    exit 10
}

# Check for root
if [ $UID = 0 ]; then
    # Check if variable and file $VARKON_INI exist
    if [ -z $VARKON_INI ]; then
	error "\$VARKON_INI not set"
    fi
    if [ ! -f $VARKON_INI ]; then
	error "$VARKON_INI does not exist"
    fi
    INIFILE=$VARKON_INI
    OUTFILE=$VARKON_INI
    CASE=0
    echo
    echo WARNING: Your are root and working on the system configuration!
    echo
else
    # Checking if variable $VARKON_USER_INI exist
    if [ -z $VARKON_USER_INI ]; then
	if [ -z $VARKON_INI ]; then
	    error "Neiter \$VARKON_USER_INI nor \$VARKON_INI set"
	fi
	INIFILE=$VARKON_INI
	OUTFILE=`dirname $USERINI`/cnf/ini/$VARKON_LANG/linux
	CASE=1
	cat <<EOF

WARNING: \$VARKON_USER_INI not set.
         Using \`$INIFILE' as default!
         Saving into \`$OUTFILE'
EOF
    else
    INIFILE=$VARKON_USER_INI
    OUTFILE=$VARKON_USER_INI
    CASE=2
    fi
    # Checking if file $INIFILE exist
    if [ ! -f $INIFILE ]; then
	INIFILE=$VARKON_INI
	OUTFILE=`dirname $USERINI`/cnf/ini/$VARKON_LANG/linux
	CASE=1
	cat <<EOF

WARNING: \`$VARKON_USER_INI' does not exist.
         Using \`$INIFILE' as default!
         Saving into \`$OUTFILE'
EOF
    fi
fi

# Getting the current system configuration
SYS_MBS_EMULATOR=`grep ^varkon\.mbsedit\.emulator: $VARKON_INI | sed -e "s/^varkon.mbsedit.emulator:[[:blank:]]*//"`
SYS_MBS_EMULATOR=${SYS_MBS_EMULATOR:-none}
SYS_MBS_EDITOR=`grep ^varkon\.mbsedit\.editor: $VARKON_INI | sed -e "s/^varkon.mbsedit.editor:[[:blank:]]*//"`
SYS_HTML_VIEWER=`grep ^varkon\.html_viewer: $VARKON_INI | sed -e "s/^varkon.html_viewer:[[:blank:]]*//"`

# Getting the current user configuration
if [ $CASE = 0 ]; then
    # for root user=system config...
    MBS_EMULATOR=$SYS_MBS_EMULATOR
    MBS_EDITOR=$SYS_MBS_EDITOR
    HTML_VIEWER=$SYS_HTML_VIEWER
    # ...and default=varkon config
    DEF_MBS_EMULATOR=$VRK_MBS_EMULATOR
    DEF_MBS_EDITOR=$VRK_MBS_EDITOR
    DEF_HTML_VIEWER=$VRK_HTML_VIEWER
else
    MBS_EMULATOR=`grep ^varkon\.mbsedit\.emulator: $INIFILE | sed -e "s/^varkon.mbsedit.emulator:[[:blank:]]*//"`
    MBS_EMULATOR=${MBS_EMULATOR:-none}
    MBS_EDITOR=`grep ^varkon\.mbsedit\.editor: $INIFILE | sed -e "s/^varkon.mbsedit.editor:[[:blank:]]*//"`
    HTML_VIEWER=`grep ^varkon\.html_viewer: $INIFILE | sed -e "s/^varkon.html_viewer:[[:blank:]]*//"`
    # default=sys config
    DEF_MBS_EMULATOR=$SYS_MBS_EMULATOR
    DEF_MBS_EDITOR=$SYS_MBS_EDITOR
    DEF_HTML_VIEWER=$SYS_HTML_VIEWER
fi

NEW_MBS_EMULATOR=$MBS_EMULATOR
NEW_MBS_EDITOR=$MBS_EDITOR
NEW_HTML_VIEWER=$HTML_VIEWER

# Give some good advice
echo "Please make sure, that all programs exist (no checking will be made)!"
echo

# Do the big loop
change=1
while [ $change = 1 ] ; do
    # Show the current configuration
    echo
    echo -e "Configuration:\tcurrent  (old)"
    echo -e "`if [ "$NEW_HTML_VIEWER" != "$HTML_VIEWER" ]; then echo -n '*'; else echo -n " "; fi`1 html_viewer:\t$NEW_HTML_VIEWER  ($HTML_VIEWER)"
    echo -e "`if [ "$NEW_MBS_EDITOR" != "$MBS_EDITOR" ]; then echo -n '*'; else echo -n " "; fi`2 mbseditor:\t$NEW_MBS_EDITOR  ($MBS_EDITOR)"
    echo -e "`if [ "$NEW_MBS_EMULATOR" != "$MBS_EMULATOR" ]; then echo -n '*'; else echo -n " "; fi`3 mbsemulator:\t$NEW_MBS_EMULATOR  ($MBS_EMULATOR)"

    # Ask if user want to change anything
    ans=""
    while [ "$ans" != "1" -a "$ans" != "2" -a "$ans" != "3" -a "$ans" != "s" -a "$ans" != "c" -a "$ans" != "h" ] ; do
	if [ "$ans" ] ; then echo "Please answer either \`e', \`s', \`c' or \`h'"; fi

	echo -n "Do you want to edit (1-3), Save, Cancel or see Help? [1|2|3|s|c|H] " > /dev/tty
	read ans < /dev/tty
	ans="`echo $ans | tr A-Z a-z`"
	ans=${ans:-h}
	case "$ans" in
	    "s")		# No change -> save
		change=0
		;;
	    "c")		# No change -> cancel
		echo No configuration written.
		exit 0
		;;
	    "h")		# Help
		change=1
		cat <<EOF


Your can change the following items

html_viewer:
Browser to show documentation (needs to run under X).
Examples:          "firefox", "xterm -title Varkon-Help -e lynx"
System's default:  $SYS_HTML_VIEWER
VARKON's original: $VRK_HTML_VIEWER
Your setting:      ${NEW_HTML_VIEWER:-$DEF_HTML_VIEWER}

mbseditor:
Your favourite editor to change mbs files.
Examples:          "vi", "xemacs", "\$EDITOR" (only if set!)
System's default:  $SYS_MBS_EDITOR
VARKON's original: $VRK_MBS_EDITOR
Your setting:      ${NEW_MBS_EDITOR:-$DEF_MBS_EDITOR}

mbsemulator:
If the "mbseditor" needs a terminal emulator.
Examples:          "xterm -title MBS-Edit -e", "rxvt -e",
                   "none" (if it needs no terminal, e.g. for xemacs)
System's default:  $SYS_MBS_EMULATOR
VARKON's original: $VRK_MBS_EMULATOR
Your setting:      ${NEW_MBS_EMULATOR:-$DEF_MBS_EMULATOR}

EOF
		;;
	    "1")		# Change html_viewer
		change=1
		echo -n "Please enter new html_viewer (ENTER for \"$DEF_HTML_VIEWER\"): " > /dev/tty
		read answer < /dev/tty
		NEW_HTML_VIEWER=${answer:-$DEF_HTML_VIEWER}
		;;
	    "2")		# Change mbseditor
		change=1
		echo -n "Please enter new mbseditor (ENTER for \"$DEF_MBS_EDITOR\"): " > /dev/tty
		read answer < /dev/tty
		NEW_MBS_EDITOR=${answer:-$DEF_MBS_EDITOR}
		;;
	    "3")		# Change mbsemulator
		change=1
		echo -n "Please enter new mbsemulator (\"none\" if your mbseditor does not need a terminal, ENTER for \"$DEF_MBS_EMULATOR\"): " > /dev/tty
		read answer < /dev/tty
		NEW_MBS_EMULATOR=${answer:-$DEF_MBS_EMULATOR}
		;;
	esac
    done
done

# Preparing to save the configuration files
if [ "$NEW_MBS_EMULATOR" = "none" ]; then
    NEW_MBS_EMULATOR=""
fi

# Save the configuration files
case "$CASE" in
    "0"|"2")		# $VARKON_USER_INI file exists already
	TMP_OUTFILE=`tempfile`

	if [ "$MBS_EMULATOR" ]; then
	    cat $INIFILE | sed -e "/^varkon\.mbsedit\.emulator.*/s/.*/varkon.mbsedit.emulator:        $NEW_MBS_EMULATOR/" > $TMP_OUTFILE
	    cp -f $TMP_OUTFILE $OUTFILE
	elif [ "$NEW_MBS_EMULATOR" ]; then
	    echo "varkon.mbsedit.emulator:        $NEW_MBS_EMULATOR" >> $OUTFILE
	fi
	if [ "$MBS_EDITOR" ]; then
	    cat $INIFILE | sed -e "/^varkon\.mbsedit\.editor:*/s/.*/varkon.mbsedit.editor:          $NEW_MBS_EDITOR/" > $TMP_OUTFILE
	    cp -f $TMP_OUTFILE $OUTFILE
	elif [ "NEW_MBS_EDITOR" ]; then
	    echo "varkon.mbsedit.editor:          $NEW_MBS_EDITOR" >> $OUTFILE
	fi
	if [ "$HTML_VIEWER" ]; then
	    cat $INIFILE | sed -e "/^varkon\.html_viewer:*/s/.*/varkon.html_viewer:             $NEW_HTML_VIEWER/" > $TMP_OUTFILE
	    cp -f $TMP_OUTFILE $OUTFILE
	elif [ "$NEW_HTML_VIEWER" ]; then
	    echo "varkon.html_viewer:             $NEW_HTML_VIEWER" >> $OUTFILE
	fi

	rm -f $TMP_OUTFILE
	;;
    "1")		# no $VARKON_USER_INI file
	mkdir -p `dirname $OUTFILE`
	echo "varkon.mbsedit.emulator:        $NEW_MBS_EMULATOR" >> $OUTFILE
	echo "varkon.mbsedit.editor:          $NEW_MBS_EDITOR" >> $OUTFILE
	echo "varkon.html_viewer:             $NEW_HTML_VIEWER" >> $OUTFILE
	;;
esac

# Epilog
echo
echo "Configuration written to \`$OUTFILE'."
if [ $CASE != 0 ]; then
    OLD_VARKON_USER_INI_ENTRY=""
    if [ -f $USERINI ]; then
	OLD_VARKON_USER_INI_ENTRY=`grep ^[[:blank:]]*VARKON_USER_INI= $USERINI`
    fi
    if [ "$OLD_VARKON_USER_INI_ENTRY" ]; then
	cat $USERINI | sed -e "s^$OLD_VARKON_USER_INI_ENTRYVARKON_USER_INI=$OUTFILE" > $USERINI
    else
	mkdir -p `basename $USERINI`
	echo VARKON_USER_INI=$OUTFILE >> $USERINI
	echo "Variable 'VARKON_USER_INI=$OUTFILE'"
	echo "         appended to \`$USERINI'."
    fi
fi
echo "For fine tuning edit \`$OUTFILE'"
echo "                 and \``if [ $CASE = 0 ]; then echo $SYSINI; else echo $USERINI; fi`'!"
}							# end config_ini


# Make the safe "builtin" configuration
VARKON_LANG=english
VARKON_MDF=/etc/varkon/mdf/$VARKON_LANG
VARKON_FNT=/etc/varkon/cnf/fnt
VARKON_PLT=/etc/varkon/cnf/plt
VARKON_ICO=/etc/varkon/cnf/icons
VARKON_TOL=/etc/varkon/cnf/tol
VARKON_INI=/etc/varkon/cnf/ini/$VARKON_LANG
VARKON_ERM=/usr/share/varkon/erm
VARKON_LIB=/usr/share/varkon/lib
VARKON_DOC=/usr/share/varkon/man
VARKON_TMP=/tmp
LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
VARKON_EXE=xvarkon
VARKON_PID=$HOME/varkon/pid
VARKON_PRD=$HOME/varkon/app
PATH=/usr/lib/varkon:$PATH

# Source the system wide configuration
if [ -f $SYSINI ]; then
    source $SYSINI
fi

# Check for "-h|-?|--help" in command options
for i in $@; do
    case "$i" in
	"-h"|"-?"|"--help")
	    cat <<EOF
usage: varkon [pid [job]] [SCRIPT_OPTION] [VARKON_OPTION]

  pid           Project
  job           Job

SCRIPT_OPTION:
  --rc <file>   overrides the default user configuration
  --env         print the environment special for VARKON
  --exp         copy the example to the user directory
  --config      some very basic configuration and exit
  -h|-?|--help  print this help and exit

All other options are passed to VARKON:
EOF
	    $VARKON_EXE --help
	    exit 0
	    ;;
    esac
done

# Parse the command line
PRINT_ENV=0
CONFIG_INI=0
while [ $# != 0 ]; do
    case "$1" in
	"--rc")
	    USERINI=$2
	    shift
	    shift
	    ;;
	"--env")
	    PRINT_ENV=1
	    shift
	    ;;
	"--exp")
	    cp_example
	    shift
	    ;;
	"--config")
	    CONFIG_INI=1
	    shift
	    ;;
	*)
	    VARKON_CMD="$VARKON_CMD $1"
	    shift
	    ;;
    esac
done

# Source the user configuration
if [ -f $USERINI ]; then
    source $USERINI
fi

# Switch to configuration
if [ $CONFIG_INI = 1 ]; then
    config_ini
    exit 0
fi

# Check for the VARKON_USER_INI file
if [ "$VARKON_USER_INI" ]; then
    if [ ! -f $VARKON_USER_INI ]; then
	echo "ERROR: User ini file ($VARKON_USER_INI) does not exist."
	exit 1
    fi
fi

# Check for the VARKON_TMP directory
if [ ! -d $VARKON_TMP ]; then
    echo "ERROR: Temporary directory ($VARKON_TMP) does not exist."
fi

# Check for the VARKON_PID directory
if [ ! -d $VARKON_PID ]; then
    ask_create $VARKON_PID "project information"
    SCORE=1
fi

# Check for the VARKON_PRD directory
if [ ! -d $VARKON_PRD ]; then
    ask_create $VARKON_PRD "application data"
    SCORE=1$SCORE
fi

# Ask user if s/he wants the example copied to her/his directories?
if [ "$SCORE" = "11" ]; then
    ask_example
fi

# Print the environment
if [ $PRINT_ENV = 1 ]; then
    cat <<EOF
VARKONs configuration is read from:
$SYSINI
$USERINI `if [ ! -f $USERINI ]; then echo "(not available!)"; fi`

Environment for VARKON (for explanation see $SYSINI):
VARKON_MDF: $VARKON_MDF
VARKON_FNT: $VARKON_FNT
VARKON_PLT: $VARKON_PLT
VARKON_ICO: $VARKON_ICO
VARKON_TOL: $VARKON_TOL
VARKON_INI: $VARKON_INI
VARKON_ERM: $VARKON_ERM
VARKON_LIB: $VARKON_LIB
VARKON_DOC: $VARKON_DOC
VARKON_TMP: $VARKON_TMP
LD_LIBRARY_PATH: $LD_LIBRARY_PATH
VARKON_PID: $VARKON_PID
VARKON_PRD: $VARKON_PRD
PATH:       $PATH

VARKON starts with:
$VARKON_EXE $VARKON_CMD -i$VARKON_INI `if [ "$VARKON_USER_INI" ]; then echo "-i$VARKON_USER_INI"; fi`

EOF
fi

# Export the environment
export VARKON_MDF
export VARKON_FNT
export VARKON_PLT
export VARKON_ICO
export VARKON_TOL
export VARKON_INI
export VARKON_ERM
export VARKON_LIB
export VARKON_DOC
export VARKON_TMP
export LD_LIBRARY_PATH
export VARKON_PID
export VARKON_PRD
export PATH

# Start the VARKON executable
$VARKON_EXE $VARKON_CMD -i$VARKON_INI `if [ "$VARKON_USER_INI" ]; then echo "-i$VARKON_USER_INI"; fi`

