#!/bin/sh
############################################################################
#
# xprint	X print server
# chkconfig:	235 98 00
# description:	Xprt is the daemon for Xprint
# Author:	Rafal Cygnarowski <pascalek@pld.org.pl>
#		Oryginally written by Ronald Mainz
#		<roland.mainz@informatik.med.uni-giessen.de>
#
############################################################################

# Source function library.
. /etc/rc.d/init.d/functions
CONFIG=/etc/sysconfig/xprint

[ -r "$CONFIG" ] && . "$CONFIG"

# Set the location of the Xprt binary we want to use.
[ -z "$DEFAULT_XPRT_BIN" ] && DEFAULT_XPRT_BIN="/usr/X11R6/bin/Xprt"
[ -z "$DEFAULT_AUTOSEARCH_FONTPATH" ] && DEFAULT_AUTOSEARCH_FONTPATH="/usr/share/fonts"

# Set the location of the global file where we store the locations 
# of the system-wide servers
XPSERVERS_FILE="/var/run/Xprint_servers"

# Set umask that owner can r/w all files and everyone else can read them
umask 022

# List of servers to start
XP_BOOT_SERVERS=$(( \
	cd /etc/sysconfig/Xprint && ls -1 Xprint* | \
	egrep 'Xprint[0-9\.]+$' | \
	xargs egrep -l "ONBOOT=[^n][^o]" | \
	awk ' { gsub(/Xprint/,NIL); print $0 } ') 2> /dev/null \
)

# Get list of system fonts
get_fontpath()
{
    # List all fonts in all locales installed on this machine
    TMP=""
    [ -d "$AUTOSEARCH_FONTPATH" ] && \
	TMP=`find $AUTOSEARCH_FONTPATH -type f -name fonts.dir -exec dirname '{}' ';'; find $AUTOSEARCH_FONTPATH -type l -name fonts.dir -exec dirname '{}' ';'`

    for DIR in "$OTHER_FONTPATH"
    do 
	[ -f "$DIR/fonts.dir" ] && TMP="$TMP $DIR"
    done

    # Filter fontlist
    TMP=$( \
	echo "$TMP" | sort | uniq | \
	egrep "$FONTPATH_ACCEPT_PATERN" | \
	fgrep -v "/models/" | \
	egrep -v "$FONTPATH_REJECT_PATERN"
    )
    
    # Sort fontpaths 
    TMP2=""
    for i in $FONTPATH_SORTLIST
    do
	TMP2="$TMP2 `echo "$TMP" | egrep "$i"`"
    done
    FONTPATH_SORTLIST=`echo $FONTPATH_SORTLIST | tr ' ' '|'`
    TMP2="$TMP2 `echo "$TMP" | egrep -v "$FONTPATH_SORTLIST"`"

    echo $TMP2 | tr " " ","
}

FoundFreeDisplay() 
{
    DISP="$1"
    [ -z "$DISP" ] && DISP="$FIRSTDISPLAYNUMBER"
    [ -z "$DISP" ] && DISP=30

    while /bin/true 
    do
	if  [ ! -f "/tmp/.X$DISP-lock" ] && 
	    [ ! -f "/tmp/.X11-unix/X$DISP" ] && 
	    [ ! -f "/tmp/.X11-pipe/X$DISP" ]; then
	    return "$DISP"
	fi
	DISP=$(( $DISP + 1 ))
    done
}

do_start() 
{
    HOSTNAME=`hostname`

    echo "# Xprint server list" > "$XPSERVERS_FILE"
    echo "# Do not edit, rely on the content or file format." >> "$XPSERVERS_FILE"
    
    # wait for print spooler
    for i in 0 1 2 3 4 5 6 7 8 9 
    do
	[ -z "$is_spool_running" ] && \
	    is_spool_running=`ps -A | egrep 'lpd|lpsched|cupsd' | fgrep -v 'grep'` && \
	    sleep 3s
    done

    for XP_SERVER in $XP_BOOT_SERVERS
    do
        # Check if the service is already running?
        if [ ! -f "/var/lock/subsys/Xprint$XP_SERVER" ]; then
	    msg_starting "Xprint$XP_SERVER"; busy

	    XPRT_BIN=""
	    AUTOSEARCH_FONTPATH=""
	    OTHER_FONTPATH=""
	    FONTPATH_ACCEPT_PATERN=""
	    FONTPATH_REJECT_PATERN=""
	    OPTIONS=""
	    AUDIT_LEVEL=""
	    XPFILE=""
	    USE_ACCESSCONTROL=""
	    DISPLAY=""
	    XPCONFIGDIR=""
	    FONTPATH_SORTLIST=""
	    XFSSERVERS=""
		
	    [ -r "/etc/sysconfig/Xprint/Xprint$XP_SERVER" ] && . "/etc/sysconfig/Xprint/Xprint$XP_SERVER"
	    [ -z "$XPRT_BIN" ] && XPRT_BIN="$DEFAULT_XPRT_BIN"
	    [ -z "$AUTOSEARCH_FONTPATH" ] && AUTOSEARCH_FONTPATH="$DEFAULT_AUTOSEARCH_FONTPATH"
	    [ -z "$OTHER_FONTPATH" ] && OTHER_FONTPATH="$DEFAULT_OTHER_FONTPATH"
	    [ -z "$FONTPATH_ACCEPT_PATERN" ] && FONTPATH_ACCEPT_PATERN="$DEFAULT_FONTPATH_ACCEPT_PATERN"
	    [ -z "$FONTPATH_REJECT_PATERN" ] && FONTPATH_REJECT_PATERN="$DEFAULT_FONTPATH_REJECT_PATERN"
	    [ -z "$AUDIT_LEVEL" ] && AUDIT_LEVEL="$DEFAULT_AUDIT_LEVEL"
	    [ -z "$XPFILE" ] && XPFILE="$DEFAULT_XPFILE"
	    [ -z "$USE_ACCESSCONTROL" ] && USE_ACCESSCONTROL="$DEFAULT_USE_ACCESSCONTROL"
	    [ -z "$XPCONFIGDIR" ] && XPCONFIGDIR="$DEFAULT_XPCONFIGDIR"
	    [ -z "$FONTPATH_SORTLIST" ] && FONTPATH_SORTLIST="$DEFAULT_FONTPATH_SORTLIST"
	    export XPCONFIGDIR
	    [ -z "$XPCONFIGDIR" ] && unset XPCONFIGDIR
		
	    FONTPATH=$( get_fontpath )
	    [ ! -z "$XFSSERVERS" ] && FONTPATH="$FONTPATH,$XFSSERVERS"
	    [ ! -z "$AUDIT_LEVEL" ] && OPTIONS="-audit $AUDIT_LEVEL"
	    [ ! -z "$XPFILE"] && OPTIONS="-XpFile $XPFILE $OPTIONS"
	    if is_no "$USE_ACCESSCONTROL"; then  OPTIONS="-ac $OPTIONS"; fi
	    [ ! -z "$FONTPATH" ] && OPTIONS="-fp $FONTPATH $OPTIONS"
	    FoundFreeDisplay $DISPLAY
	    DISPLAY="$?"
		
	    $XPRT_BIN $OPTIONS :$DISPLAY 1>> /var/log/Xprint$XP_SERVER 2>&1 &
	    RETVAL="$?"
    	    if [ "$RETVAL" -eq 0 ]; then
	        echo "display=$HOSTNAME:$DISPLAY display_id=$DISPLAY pid=$!" > "/var/lock/subsys/Xprint$XP_SERVER" 
	        echo "display=$HOSTNAME:$DISPLAY display_id=$DISPLAY pid=$!" >> "$XPSERVERS_FILE"
		deltext; ok
	    else
		deltext; fail
	    fi
	else
    	    msg_already_running "Xprint$XP_SERVER"
	    cat "/var/lock/subsys/Xprint$XP_SERVER" >> "$XPSERVERS_FILE"
	fi
    done
}

do_stop() 
{
    for XP_SERVER in $XP_BOOT_SERVERS
    do
	if [ -f "/var/lock/subsys/Xprint$XP_SERVER" ]; then
    	    msg_stopping "Xprint$XP_SERVER"; busy
	
	    XPRT_BIN=""
	    [ -r "/etc/sysconfig/Xprint/Xprint$XP_SERVER" ] && . "/etc/sysconfig/Xprint/Xprint$XP_SERVER"
	    [ -z "$XPRT_BIN" ] && XPRT_BIN="$DEFAULT_XPRT_BIN"
	    XPRT_BIN=`basename "$XPRT_BIN"`

	    PID=`cat /var/lock/subsys/Xprint$XP_SERVER | awk '{ print $3 }' | awk -F\= '{ print $2 }'` 2> /dev/null
	    DISP=`cat /var/lock/subsys/Xprint$XP_SERVER | awk '{ print $2 }' | awk -F\= '{ print $2 }'` 2> /dev/null
	    HAVEPID=`ps axc | awk '{ print $1 $5 }' | grep $XPRT_BIN | grep $PID | grep -v grep | wc -l`

	    rm -f "/tmp/.X$DISP-lock" 
	    rm -f "/tmp/.X11-unix/X$DISP"
	    rm -f "/tmp/.X11-pipe/X$DISP"
		
            rm -f "/var/lock/subsys/Xprint$XP_SERVER" > /dev/null 2>&1

	    if [ "$HAVEPID" -eq 1 ]; then
	        kill $PID 2> /dev/null	
		deltext; ok
	    else
		deltext; died
	    fi
    	else
	    msg_not_running "/var/lock/subsys/Xprint$XP_SERVER"
	fi
	rm -f "$XPSERVERS_FILE" > /dev/null 2>&1
    done
}

get_status()
{
    for XP_SERVER in $XP_BOOT_SERVERS
    do
	XPRT_BIN=""
	[ -r "/etc/sysconfig/Xprint/Xprint$XP_SERVER" ] && . "/etc/sysconfig/Xprint/Xprint$XP_SERVER"
	[ -z "$XPRT_BIN" ] && XPRT_BIN="$DEFAULT_XPRT_BIN"
	XPRT_BIN=`basename "$XPRT_BIN"`

	PID=`cat /var/lock/subsys/Xprint$XP_SERVER | awk '{ print $3 }' | awk -F\= '{ print $2 }'` 2> /dev/null
	HAVEPID=`ps axc | awk '{ print $1 $5 }' | grep $XPRT_BIN | grep $PID | grep -v grep | wc -l`

	if [ "$HAVEPID" -eq 1 ]; then
	    nls "%s (pid %s) is running..." "Xprint$XP_SERVER" "$PID"	
	elif [ -f "/var/lock/subsys/Xprint$XP_SERVER" ]; then
	    nls "%s dead but subsys locked" "Xprint$XP_SERVER"
	else
	    nls "%s is stopped" "Xprint$XP_SERVER"
	fi
    done
}

# See how we were called.
case "$1" in
    start)
	do_start
	;;
    stop)
	do_stop
	;;
    status)
	get_status
	;;
    restart|reload)
	$0 stop
	$0 start
	;;
    *)
	msg_usage "$0 {start|stop|status|restart|reload}"
	exit 1
esac
