#!/bin/bash
#
# Copyright (c) 2005 by Fabian Franz <freenx@fabian-franz.de>
#           (c) 2005 by Jon Severinsson <jonno@users.berlios.de>
#
# License: GPL, version 2
#
# SVN: $Id: nxloadconfig 405 2007-10-14 22:25:14Z fabianx $
#
# ========================================================================

#########################################################################
# Commandline support for --help, --check and --userconf
#########################################################################

HELP="no"
CHECK="no"
USERCONF="no"
NXLCFG_IGNORE_ERRORS="no"

while [ "$1" ]
do
	case "$1" in
		--help) HELP="yes"; shift ;;
		--check) CHECK="yes"; shift ;;
		--ignore-errors) NXLCFG_IGNORE_ERRORS="yes"; shift;;
		--userconf) USERCONF="yes" ; 
					case "$2" in
						"" | --*) shift ;;
						*) USER=$2 ; shift 2 ;;
					esac ;;
		--) shift ; break ;;
		*) echo "Invalid flag $1" ; HELP="yes"; shift ; break ;;
	esac
done

if [ "$HELP" = "yes" ]
then
	echo "nxloadconfig - Load the FreeNX configuration variables into the environment."
	echo "Syntax: nxloadconfig --help"
	echo "        nxloadconfig [--check] [--userconf [<username>]]"
	echo
	echo "  --check                  Write errors to standard output."
	echo "	--ignore-errors		 just warn, and don't exit with a error, if errors occure"
	echo "  --userconf [<username>]  Parse <username>.node.conf as well as node.conf."
	echo "                           Assume current user if no username is specified."
	exit 0
fi

#########################################################################
# INTERNAL STUFF
# DO NOT TOUCH unless you REALLY know what you are doing
#########################################################################

NX_VERSION=2.1.0-71
NX_LICENSE="OS (GPL)"

# Where can different nx components be found
NX_DIR=/usr
PATH_BIN=$NX_DIR/bin # if you change that, be sure to also change the public keys
PATH_LIB=$NX_DIR/lib
NX_ETC_DIR=/etc/nxserver
NX_SESS_DIR=/var/lib/nxserver/db
NX_HOME_DIR=/var/lib/nxserver/home

# Advanced users ONLY
AGENT_LIBRARY_PATH="" #Calculated
PROXY_LIBRARY_PATH="" #Calculated
APPLICATION_LIBRARY_PATH="" #Calculated
APPLICATION_LIBRARY_PRELOAD="" #Calculated

# the name of the authorized keys file for ssh
SSH_AUTHORIZED_KEYS="authorized_keys2"

# retest values like xauth, netcat and checks for nxdesktop/nxviewer availability
# set to 0 if you are sure, you set the right values

NXCONFIG_RETEST=1

#########################################################################
# Default Values
# A user should NEVER touch this, edit $NX_ETC_DIR/node.conf instead
#########################################################################

# General FreeNX directives

SERVER_NAME="$(hostname)"
SSHD_PORT=22

# Authentication / Security directives

ENABLE_USERMODE_AUTHENTICATION="0"
ENABLE_PASSDB_AUTHENTICATION="1"
ENABLE_SSH_AUTHENTICATION="1"
ENABLE_SU_AUTHENTICATION="0"
ENABLE_USER_DB="0"

ENABLE_FORCE_ENCRYPTION="0"
SSHD_CHECK_IP="0"


# Restriction directives

DISPLAY_BASE=1000
SESSION_LIMIT=200
SESSION_USER_LIMIT="" #Calculated
DISPLAY_LIMIT=200

ENABLE_PERSISTENT_SESSION="all"
DISABLE_PERSISTENT_SESSION=""

ENABLE_MIRROR_VIA_VNC=1
ENABLE_DESKTOP_SHARING=1

ENABLE_CLIPBOARD="both"

# Logging directives

NX_LOG_LEVEL=0
NX_LOG_SECURE=1
NX_LOGFILE=/var/log/nxserver.log
SESSION_LOG_CLEAN=1
SESSION_HISTORY=2592000


# Forwarding directives

ENABLE_SERVER_FORWARD="0"
SERVER_FORWARD_HOST=""
SERVER_FORWARD_PORT=22
SERVER_FORWARD_KEY="/usr/NX/share/client.id_dsa.key"

NOMACHINE_SERVER="/usr/NX/bin/nxserver"
NOMACHINE_NX_HOME_DIR="/usr/NX/home/nx"
ENABLE_NOMACHINE_FORWARD_PORT="0"
NOMACHINE_FORWARD_PORT="22"

LOAD_BALANCE_SERVERS=""
LOAD_BALANCE_ALGORITHM="random"
ENABLE_LOAD_BALANCE_PREFERENCE="0"

# Services directives

ENABLE_ESD_PRELOAD="0"
ESD_BIN_PRELOAD="esddsp"
ENABLE_ARTSD_PRELOAD="0"
ARTSD_BIN_PRELOAD="artsdsp"

ENABLE_KDE_CUPS="0"
ENABLE_KDE_CUPS_DYNAMIC="0"
KDE_PRINTRC="" # Calculated

ENABLE_CUPS_SERVER_EXPORT="1"
ENABLE_CUPS_SEAMLESS="0"
CUPS_SEAMLESS_DELAY="10"
ENABLE_FOOMATIC="1"
COMMAND_FOOMATIC="/usr/lib/cups/driver/foomatic-ppdfile"

CUPS_BACKEND="/usr/lib/cups/backend"
CUPS_IPP_BACKEND="$CUPS_BACKEND/nxipp"
CUPS_DEFAULT_SOCK="/var/run/cups/cups.sock"
CUPS_ETC="/etc/cups/"

SAMBA_MOUNT_SHARE_PROTOCOL="both"

# Path directives

USER_FAKE_HOME="" #Calculated
SET_LD_LIBRARY_PATH="1"

DEFAULT_X_WM=""
KILL_DEFAULT_X_WM="1"
USER_X_STARTUP_SCRIPT=.Xclients
DEFAULT_X_SESSION=/etc/X11/xdm/Xsession
COMMAND_START_KDE=startkde
COMMAND_START_GNOME=gnome-session
COMMAND_START_CDE=cdwm
COMMAND_XTERM=xterm
COMMAND_XAUTH=/usr/X11R6/bin/xauth
COMMAND_SMBMOUNT=smbmount
COMMAND_SMBUMOUNT=smbumount
COMMAND_SMBMOUNT_CIFS=/sbin/mount.cifs
COMMAND_SMBUMOUNT_CIFS=/sbin/umount.cifs
COMMAND_NETCAT=netcat
COMMAND_SSH=ssh
COMMAND_SSH_KEYGEN=ssh-keygen
COMMAND_CUPSD=/usr/sbin/cupsd
COMMAND_MD5SUM="openssl md5"
COMMAND_PERL=perl
COMMAND_RDESKTOP="rdesktop"
COMMAND_VNCVIEWER="vncviewer"
COMMAND_VNCPASSWD="$PATH_BIN/nxpasswd"
COMMAND_X11VNC="x11vnc"

# Misc directives

ENABLE_2_0_0_BACKEND=""
ENABLE_AUTORECONNECT="0"
ENABLE_AUTORECONNECT_BEFORE_140="1"
EXPORT_USERIP="0"
EXPORT_SESSIONID="1"
NODE_AUTOSTART=""
ENABLE_ROOTLESS_MODE="1"
ENABLE_USESSION="0"
COMMAND_SESSREG="sessreg"
AGENT_EXTRA_OPTIONS_RFB=""
AGENT_EXTRA_OPTIONS_RDP=""
AGENT_EXTRA_OPTIONS_X=""
AGENT_STARTUP_TIMEOUT="60"
AGENT_FONT_SERVER=""
PROXY_TCP_NODELAY=""
PROXY_EXTRA_OPTIONS=""
ENABLE_EXTERNAL_NXDESKTOP="0"
ENABLE_EXTERNAL_NXDESKTOP_KEYBOARD="1"
ENABLE_EXTERNAL_NXVIEWER="0"

############################################################################
# OS specific directives
############################################################################

OS="$( uname -sr )"

case "$OS" in
	"SunOS 5.10")
		DEFAULT_X_WM=cdwm
		DEFAULT_X_SESSION=/etc/X11/gdm/Xsession
		COMMAND_XTERM=/usr/openwin/bin/xterm
		COMMAND_XAUTH=/usr/openwin/bin/xauth
		COMMAND_CUPSD=/opt/sfw/cups/sbin/cupsd
		COMMAND_MD5SUM=gmd5sum
		PATH=/usr/xpg4/bin:/usr/openwin/bin:$PATH
		export PATH
		;;
esac

# replace incompatible commands

case "$OS" in
       "SunOS 5.10")
               function which()
               {
                       [ -e "$1" ] && echo $1 && return 0
                       [ -z "$1" ] && return 1
                       for i in  $(echo $PATH | tr ":" "\n"); do
                               [ -e $i/$1 ] && echo $i/$1 && return 0
                       done
                       return 1
               }
       ;;
esac

#
# Utility functions
#

function mywhich()
{
	which $(echo "$*" | cut -d" " -f1)
}

#########################################################################
# Retested values
#########################################################################

if [ "$NXCONFIG_RETEST" = "1" ]
then
	{ ! mywhich "$COMMAND_XAUTH" && which xauth; } >/dev/null 2>&1 && COMMAND_XAUTH=$(which xauth)
	{ ! mywhich "$COMMAND_NETCAT" && which nc; } >/dev/null 2>&1 && COMMAND_NETCAT=$(which nc)
	{ ! mywhich "$PATH_BIN/nxdesktop"; } >/dev/null 2>&1 && ENABLE_EXTERNAL_NXDESKTOP="1"
	{ ! mywhich "$PATH_BIN/nxviewer"; } >/dev/null 2>&1 && ENABLE_EXTERNAL_NXVIEWER="1"
	{ ! mywhich "$COMMAND_VNCPASSWD" && which vncpasswd; } >/dev/null 2>&1 && COMMAND_VNCPASSWD=$(which vncpasswd)
fi

#########################################################################
# node.conf file evaluation
#########################################################################

if [ -d $NX_ETC_DIR/node.conf.d ]
then
	for i in $NX_ETC_DIR/node.conf.d/*
	do
		[ -e $i ] && . $i
	done
fi

[ -e $NX_ETC_DIR/node.conf ] && . $NX_ETC_DIR/node.conf
[ "$USERCONF" = "yes" -a -e $NX_ETC_DIR/$USER.node.conf ] && . $NX_ETC_DIR/$USER.node.conf


#########################################################################
# Calculated values
#########################################################################

[ -z "$SESSION_USER_LIMIT" ] && SESSION_USER_LIMIT=$SESSION_LIMIT
[ -z "$USER_FAKE_HOME" ] && USER_FAKE_HOME=$HOME

[ -z "$AGENT_LIBRARY_PATH" ] && AGENT_LIBRARY_PATH=$PATH_LIB
[ -z "$PROXY_LIBRARY_PATH" ] && PROXY_LIBRARY_PATH=$PATH_LIB
[ -z "$APPLICATION_LIBRARY_PATH" ] && APPLICATION_LIBRARY_PATH=$PATH_LIB
[ -z "$APPLICATION_LIBRARY_PRELOAD" ] && APPLICATION_LIBRARY_PRELOAD="$APPLICATION_LIBRARY_PATH/libX11.so.6.2:$APPLICATION_LIBRARY_PATH/libXext.so.6.4:$APPLICATION_LIBRARY_PATH/libXcomp.so:$APPLICATION_LIBRARY_PATH/libXcompext.so:$APPLICATION_LIBRARY_PATH/libXrender.so.1.2"
if [ -z "$ENABLE_2_0_0_BACKEND" ]
then
	ENABLE_2_0_0_BACKEND="1"
	[ -z "$(strings $PATH_BIN/nxagent | egrep 'NXAGENT - Version 2.[01].0|NXAGENT - Version 3.0.0')" ] && ENABLE_2_0_0_BACKEND="0"
fi 

if [ "$ENABLE_KDE_CUPS" = "1" ]
then
	[ -z "$KDE_PRINTRC" -a -n "$KDEHOME" ] && KDE_PRINTRC="$KDEHOME/share/config/kdeprintrc"
	[ -z "$KDE_PRINTRC" ] && which kde-config >/dev/null 2>&1 && KDE_PRINTRC=$(kde-config --localprefix 2>/dev/null)"/share/config/kdeprintrc"
	[ -z "$KDE_PRINTRC" -o ! -r "$KDE_PRINTRC" ] && KDE_PRINTRC="$HOME/.kde/share/config/kdeprintrc"
fi

#########################################################################
# Support for --check
#########################################################################

if [ "$CHECK" = "yes" ]
then
	ERROR="no"
	WARNING="no"
	
	# Internal Stuff
	
	[ ! -d "$PATH_BIN" ] && \
		ERROR="yes" && echo "Error: Invalid value \"PATH_BIN=$PATH_BIN\""
	# Check for NX agents ...
	
	[ ! -x "$PATH_BIN/nxagent" ] && \
		ERROR="yes" && echo "Error: Could not find nxagent in $PATH_BIN. Please install some OSS components."
	
	if [ "ENABLE_EXTERNAL_NXDESKTOP" = "1" ]
	then
		[ ! mywhich "$COMMAND_RDESKTOP" >/dev/null 2>&1 ] && \
			WARNING="yes" && echo "Warning: Could not find COMMAND_RDESKTOP=$COMMAND_RDESKTOP. RDP sessions won't work."
	else
		[ ! -x "$PATH_BIN/nxdesktop" ] && \
			WARNING="yes" && echo "Warning: Could not find nxdesktop in $PATH_BIN. RDP sessions won't work."
	fi
		
	if [ "ENABLE_EXTERNAL_NXVIEWER" = "1" ]
	then
		[ ! mywhich "$COMMAND_VNCVIEWER" >/dev/null 2>&1 ] && \
			WARNING="yes" && echo "Warning: Could not find COMMAND_VNCVIEWER=$COMMAND_VNCVIEWER. VNC sessions won't work."
		[ ! mywhich "$COMMAND_VNCPASSWD" >/dev/null 2>&1 ] && \
			WARNING="yes" && echo "Warning: Could not find COMMAND_VNCPASSWD=$COMMAND_VNCPASSWD. VNC sessions won't work."
	else
		[ ! -x "$PATH_BIN/nxviewer" ] && \
			WARNING="yes" && echo "Warning: Could not find nxviewer in $PATH_BIN. VNC sessions won't work."
	fi
	
	[ ! mywhich "$COMMAND_X11VNC" >/dev/null 2>&1 ] && \
			WARNING="yes" && echo "Warning: Could not find COMMAND_X11VNC=$COMMAND_X11VNC. VNC mirror sessions won't work."

	# Check for paths
		
	[ ! -d "$PATH_LIB" ] && \
		ERROR="yes" && echo "Error: Invalid value \"PATH_LIB=$PATH_LIB\""
	[ ! -d "$NX_ETC_DIR" ] && \
		ERROR="yes" && echo "Error: Invalid value \"NX_ETC_DIR=$NX_ETC_DIR\""
	[ ! -d "$NX_SESS_DIR" ] && \
		ERROR="yes" && echo "Error: Invalid value \"NX_SESS_DIR=$NX_SESS_DIR\""
	[ ! -d "$NX_HOME_DIR" ] && \
		ERROR="yes" && echo "Error: Invalid value \"NX_HOME_DIR=$NX_HOME_DIR\""

	[ ! -d "$AGENT_LIBRARY_PATH" ] && \
		ERROR="yes" && echo "Error: Invalid value \"AGENT_LIBRARY_PATH=$AGENT_LIBRARY_PATH\""
	[ ! -d "$PROXY_LIBRARY_PATH" ] && \
		ERROR="yes" && echo "Error: Invalid value \"PROXY_LIBRARY_PATH=$PROXY_LIBRARY_PATH\""
	[ ! -d "$APPLICATION_LIBRARY_PATH" ] && \
		ERROR="yes" && echo "Error: Invalid value \"APPLICATION_LIBRARY_PATH=$APPLICATION_LIBRARY_PATH\""
	
	OLD_IFS=$IFS
	IFS=":"
	for LIBRARY in $APPLICATION_LIBRARY_PRELOAD; do
		[ ! -e $LIBRARY ] && \
			WARNING="yes" && echo "Warning: Invalid value \"APPLICATION_LIBRARY_PRELOAD=$APPLICATION_LIBRARY_PRELOAD\". $LIBRARY could not be found. Users will not be able to run a single application in non-rootless mode." && break ;
	done
	IFS=$OLD_IFS
	
	[ -z "$SSH_AUTHORIZED_KEYS" ] && \
		ERROR="yes" && echo "Error: Invalid value \"SSH_AUTHORIZED_KEYS=$SSH_AUTHORIZED_KEYS\""
	
	
	# General FreeNX directives
	
	[ -z "$SERVER_NAME" ] && \
		ERROR="yes" && echo "Error: Invalid value \"SERVER_NAME=$SERVER_NAME\""
	[ -z $(echo "$SSHD_PORT" | egrep "^[1-9][0-9]{0,4}$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"SSHD_PORT=$SSHD_PORT\""
	
	
	# Authentication / Security directives
	
	[ -z $(echo "$ENABLE_PASSDB_AUTHENTICATION" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_PASSDB_AUTHENTICATION=$ENABLE_PASSDB_AUTHENTICATION\""
	[ -z $(echo "$ENABLE_SSH_AUTHENTICATION" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_SSH_AUTHENTICATION=$ENABLE_SSH_AUTHENTICATION:\""
	[ -z $(echo "$ENABLE_SU_AUTHENTICATION" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_SU_AUTHENTICATION=$NENABLE_SU_AUTHENTICATION\""
	[ -z $(echo "$ENABLE_USER_DB" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_USER_DB=$ENABLE_USER_DB\""
	
	[ -z $(echo "$ENABLE_FORCE_ENCRYPTION" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_FORCE_ENCRYPTION=$ENABLE_FORCE_ENCRYPTION\""
	[ -z $(echo "$SSHD_CHECK_IP" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"SSHD_CHECK_IP=$SSHD_CHECK_IP\""
	
	
	# Restriction directives
	
	[ -z $(echo "$DISPLAY_BASE" | egrep "^[1-9][0-9]{0,4}$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"DISPLAY_BASE=$DISPLAY_BASE\""
	[ -z $(echo "$SESSION_LIMIT" | egrep "^[1-9][0-9]{0,4}$") ] &&  \
		ERROR="yes" && echo "Error: Invalid value \"SESSION_LIMIT=$SESSION_LIMIT\""
	[ -z $(echo "$SESSION_USER_LIMIT" | egrep "^[1-9][0-9]{0,4}$") -o $SESSION_USER_LIMIT -gt $SESSION_LIMIT ] && \
		ERROR="yes" && echo "Error: Invalid value \"SESSION_USER_LIMIT=$SESSION_USER_LIMIT\""
	[ -z $(echo "$DISPLAY_LIMIT" | egrep "^[1-9][0-9]{0,4}$") -o $DISPLAY_LIMIT -lt $SESSION_LIMIT ] && \
		ERROR="yes" && echo "Error: Invalid value \"DISPLAY_LIMIT=$DISPLAY_LIMIT\""
	
	OLD_IFS=$IFS
	IFS=","
	if [ "$ENABLE_PERSISTENT_SESSION" != "all" ]
	then
		for USERNAME in $ENABLE_PERSISTENT_SESSION; do
			[ "${USERNAME:0:1}" != "@" ] && [ -z $(getent passwd $USERNAME) ] && \
				ERROR="yes" && echo "Error: Invalid value \"ENABLE_PERSISTENT_SESSION=$ENABLE_PERSISTENT_SESSION\"" && break ;
			[ "${USERNAME:0:1}" = "@" ] && [ -z $(getent group ${USERNAME:1}) ] && \
				ERROR="yes" && echo "Error: Invalid value \"ENABLE_PERSISTENT_SESSION=$ENABLE_PERSISTENT_SESSION\"" && break ;
		done
	fi
	for USERNAME in $DISABLE_PERSISTENT_SESSION; do
		[ "${USERNAME:0:1}" != "@" ] && [ -z $(getent passwd $USERNAME) ] && \
			ERROR="yes" && echo "Error: Invalid value \"DISABLE_PERSISTENT_SESSION=$DISABLE_PERSISTENT_SESSION\"" && break ;
		[ "${USERNAME:0:1}" = "@" ] && [ -z $(getent group ${USERNAME:1}) ] && \
			ERROR="yes" && echo "Error: Invalid value \"DISABLE_PERSISTENT_SESSION=$DISABLE_PERSISTENT_SESSION\"" && break ;
	done
	IFS=$OLD_IFS
	
	
	# Logging directives
	
	[ -z $(echo "$NX_LOG_LEVEL" | egrep "^[0-7]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"NX_LOG_LEVEL=$NX_LOG_LEVEL\""
	[ "$NX_LOG_LEVEL" != "0" -a ! -e "$NX_LOGFILE" ] && \
		WARNING="yes" && echo "Warning: Invalid value \"NX_LOGFILE=$NX_LOGFILE\"" \
					  && echo "         No logfile will be kept."
		# How do I check if another user might write to a file? ( -w checks only current user)
	[ -z $(echo "$SESSION_LOG_CLEAN" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"SESSION_LOG_CLEAN=$SESSION_LOG_CLEAN\""
	[ -z $(echo "$SESSION_HISTORY" | egrep "^-?[0-9]+$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"SESSION_HISTORY=$SESSION_HISTORY\""
	
	
	# Forwarding directives
	
	[ -z $(echo "$ENABLE_SERVER_FORWARD" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_SERVER_FORWARD=$ENABLE_SERVER_FORWARD\""
	[ "$ENABLE_SERVER_FORWARD" = "1" -a -z "$SERVER_FORWARD_HOST" ] && \
		ERROR="yes" && echo "Error: Invalid value \"SERVER_FORWARD_HOST=$SERVER_FORWARD_HOST\"" 
		# Any ideas on how I can check for a VALID host is velcome!
		# In my private scripts I use 'resolveip -q' and check if output conforms to [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}, 
		# but resolveip is part of mysql, and I don't think I should add that dependancy...
	[ "$ENABLE_SERVER_FORWARD" = "1" -a -z $(echo "$SERVER_FORWARD_PORT" | egrep "^[1-9][0-9]{0,4}$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"SERVER_FORWARD_PORT=$SERVER_FORWARD_PORT\""
	[ "$ENABLE_SERVER_FORWARD" = "1" -a ! -e "$SERVER_FORWARD_KEY" ] && \
		ERROR="yes" && echo "Error: Invalid value \"SERVER_FORWARD_KEY=$SERVER_FORWARD_KEY\""
	
	[ -z $(echo "$ENABLE_NOMACHINE_FORWARD_PORT" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_NOMACHINE_FORWARD_PORT=$ENABLE_NOMACHINE_FORWARD_PORT\""
	[ "$ENABLE_NOMACHINE_FORWARD_PORT" = "1" ] && ! mywhich "$NOMACHINE_SERVER" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: Invalid value \"NOMACHINE_SERVER=$NOMACHINE_SERVER\""
	[ "$ENABLE_NOMACHINE_FORWARD_PORT" = "1" -a -z $(echo "$NOMACHINE_FORWARD_PORT" | egrep "^[1-9][0-9]{0,4}$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"NOMACHINE_FORWARD_PORT=$NOMACHINE_FORWARD_PORT\""
	
	# Services directives
	
	[ -z $(echo "$ENABLE_ESD_PRELOAD" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_ESD_PRELOAD=$ENABLE_ESD_PRELOAD\""
	[ "$ENABLE_ESD_PRELOAD" = "1" ] && ! mywhich "$ESD_BIN_PRELOAD" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"ESD_BIN_PRELOAD=$ESD_BIN_PRELOAD\"" \
					  && echo "         No esd preload will be performed."
	
	[ -z $(echo "$ENABLE_ARTSD_PRELOAD" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_ARTSD_PRELOAD=$ENABLE_ARTSD_PRELOAD\""
	[ "$ARTSD_BIN_PRELOAD" = "1" ] && ! mywhich "$ARTSD_BIN_PRELOAD" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"ARTSD_BIN_PRELOAD=$ARTSD_BIN_PRELOAD\"" \
					  && echo "         No arts preload will be performed."
	
	[ -z $(echo "$ENABLE_KDE_CUPS" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_KDE_CUPS=$ENABLE_KDE_CUPS\""
	[ "$ENABLE_KDE_CUPS" = "1" -a ! -e "$KDE_PRINTRC" ] && \
		ERROR="yes" && echo "Error: Invalid value \"KDE_PRINTRC=$KDE_PRINTRC\""


	[ "$ENABLE_FOOMATIC" = "1" ] && ! mywhich "$COMMAND_FOOMATIC" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_FOOMATIC=$COMMAND_FOOMATIC\"" \
					  && echo "         Users will not be able to use foomatic."
	[ ! -x "$CUPS_IPP_BACKEND" ] && \
		WARNING="yes" && echo "Warning: \"$CUPS_IPP_BACKEND\" is not executable." \
					  && echo "         Users will not be able to enable printing."
	[ ! -x "$CUPS_BACKEND/smb" ] && \
		WARNING="yes" && echo "Warning: \"$CUPS_BACKEND/smb\" is not executable." \
					  && echo "         Users will not be able to enable printing."
	[ ! -e "$CUPS_ETC/mime.types" -o ! -e "$CUPS_ETC/mime.convs" ] && \
		WARNING="yes" && echo "Warning: Invalid value \"CUPS_ETC=$CUPS_ETC\"" \
					  && echo "         Users will not be able to enable printing."
	
	# Path directives
	
	[ ! -d "$USER_FAKE_HOME" ] && \
		ERROR="yes" && echo "Error: Invalid value \"USER_FAKE_HOME=$USER_FAKE_HOME\""
	[ -z $(echo "$SET_LD_LIBRARY_PATH" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"SET_LD_LIBRARY_PATH=$SET_LD_LIBRARY_PATH\""
	
	[ "$DEFAULT_X_WM" != "" ] && ! mywhich "$DEFAULT_X_WM" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: Invalid value \"DEFAULT_X_WM=$DEFAULT_X_WM\""
	[ "$DEFAULT_X_WM" != "" -a  -z $(echo "$KILL_DEFAULT_X_WM" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"KILL_DEFAULT_X_WM=$KILL_DEFAULT_X_WM\""
	[ -z "$USER_X_STARTUP_SCRIPT" ] && \
		ERROR="yes" && echo "Error: Invalid value \"USER_X_STARTUP_SCRIPT=$USER_X_STARTUP_SCRIPT\""
	! mywhich "$DEFAULT_X_SESSION" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"DEFAULT_X_SESSION=$DEFAULT_X_SESSION\"" \
					  && echo "         Users might not be able to request a default X session."
	! mywhich "$COMMAND_START_KDE" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_START_KDE=$COMMAND_START_KDE\"" \
					  && echo "         Users will not be able to request a KDE session."
	! mywhich "$COMMAND_START_GNOME" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_START_GNOME=$COMMAND_START_GNOME\"" \
					  && echo "         Users will not be able to request a Gnome session."
	! mywhich "$COMMAND_START_CDE" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_START_CDE=$COMMAND_START_CDE\"" \
					  && echo "         Users will not be able to request a CDE session."
	! mywhich "$COMMAND_XTERM" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_XTERM=$COMMAND_XTERM\"" \
					  && echo "         Users will not be able to request an xterm session."
	! mywhich "$COMMAND_XAUTH" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: Invalid value \"COMMAND_XAUTH=$COMMAND_XAUTH\""
	! mywhich "$COMMAND_SMBMOUNT" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_SMBMOUNT=$COMMAND_SMBMOUNT\". You'll not be able to use SAMBA. "
	! mywhich "$COMMAND_SMBUMOUNT" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_SMBUMOUNT=$COMMAND_SMBUMOUNT\". You'll not be able to use SAMBA."
	! mywhich "$COMMAND_NETCAT" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: Invalid value \"COMMAND_NETCAT=$COMMAND_NETCAT\""
	! mywhich "$COMMAND_SSH" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: Invalid value \"COMMAND_SSH=$COMMAND_SSH\""
	! mywhich "$COMMAND_SSH_KEYGEN" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: Invalid value \"COMMAND_SSH_KEYGEN=$COMMAND_SSH_KEYGEN\""
	! mywhich "$COMMAND_CUPSD" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_CUPSD=$COMMAND_CUPSD\"" \
					  && echo "         Users will not be able to enable printing."
	[ -z "$(strings $COMMAND_CUPSD | egrep 'CUPS\/1.2')" ] && \
		WARNING="yes" && echo "Warning: Invalid cupsd version of \"$COMMAND_CUPSD\". Need version 1.2." \
					  && echo "         Users will not be able to enable printing."
	! mywhich "$COMMAND_MD5SUM" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: Invalid value \"COMMAND_MD5SUM=$COMMAND_MD5SUM\""

	# Check for expect
	COMMAND_EXPECT=$(head -n1 $PATH_BIN/nxnode-login | cut -d'!' -f2)
	! mywhich "$COMMAND_EXPECT" >/dev/null 2>&1 && \
		ERROR="yes" && echo "Error: expect necessary for $PATH_BIN/nxnode-login could not be found in '$COMMAND_EXPECT'. Please install it or change nxnode-login accordingly."

	# Misc directives
	
	[ -z $(echo "$ENABLE_AUTORECONNECT" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_AUTORECONNECT=$ENABLE_AUTORECONNECT\""
	[ -z $(echo "$ENABLE_AUTORECONNECT_BEFORE_140" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_AUTORECONNECT_BEFORE_140=$ENABLE_AUTORECONNECT_BEFORE_140\""
	
	[ -z $(echo "$EXPORT_USERIP" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"EXPORT_USERIP=$EXPORT_USERIP\""
	[ -z $(echo "$EXPORT_SESSIONID" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"EXPORT_SESSIONID=$EXPORT_SESSIONID\""
	[ -n "$NODE_AUTOSTART" ] && ! mywhich "$NODE_AUTOSTART" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"NODE_AUTOSTART=$NODE_AUTOSTART\"" \
					  && echo "         No autostart will be performed."

	[ -z $(echo "$ENABLE_ROOTLESS_MODE" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_ROOTLESS_MODE=$ENABLE_ROOTLESS_MODE\""

	[ -z "$(strings $PATH_BIN/nxagent | egrep 'NXAGENT - Version 1.5.0|NXAGENT - Version 2.[01].0|NXAGENT - Version 3.0.0')" ] && \
		ERROR="yes" && echo "Error: Could not find 1.5.0 or 2.[01].0 or 3.0.0 version string in nxagent. NX 1.5.0 or 2.[01].0 or 3.0.0 backend is needed for this version of FreeNX."
		
	[ -z $(echo "$ENABLE_USESSION" | egrep "^[0|1]$") ] && \
		ERROR="yes" && echo "Error: Invalid value \"ENABLE_USESSION=$ENABLE_USESSION\""
	[ "$ENABLE_USESSION" = "1" ] && ! mywhich "$COMMAND_SESSREG" >/dev/null 2>&1 && \
		WARNING="yes" && echo "Warning: Invalid value \"COMMAND_SESSREG=$COMMAND_SESSREG\"" \
					  && echo "         Logged in users will not be registered with sessreg."
	
	#AGENT_EXTRA_OPTIONS_RFB=""
	#AGENT_EXTRA_OPTIONS_RDP=""
	#AGENT_EXTRA_OPTIONS_X=""
	#PROXY_EXTRA_OPTIONS=""
		#Can these be checked???
	
	#AGENT_FONT_SERVER=""
		#Any ideas on how I can check for a VALID host is velcome!
	
	#[ -z $(echo "$PROXY_TCP_NODELAY" | egrep "^[|0|1]$") ] && \
	#	ERROR="yes" && echo "Error: Invalid value \"PROXY_TCP_NODELAY=$PROXY_TCP_NODELAY\""
	
	
	if [ "$ERROR" = "yes" ]
	then
		echo
		echo "  Errors occured during config check."
		echo "  Please correct the configuration file."
		echo
		[ "$NXLCFG_IGNORE_ERRORS" = "no" ] && exit 1 || exit 0
	elif [ "$WARNING" = "yes" ]
	then
		echo
		echo "  Warnings occured during config check."
		echo "  To enable these features please correct the configuration file."
		echo
	fi
fi
