#!/sbin/runscript 
# Zope rc-script for Gentoo Linux
# Copyright 2002-2003 by Jason Shoemaker
# Distributed under the terms of the GNU General Public License, v2 or later.
# $Header: /home/cvsroot/gentoo-x86/net-www/zope/files/2.6.0/zope-r1.initd,v 1.2 2003/02/17 04:54:38 kutsuya Exp $

depend() 
{
    need net
}

# Since zope doesn't delete its .pid file when done, we have to determine its 
# status. Zope can be shutdown from a browser...this bypasses init.d. 

# Need to export these conf.d variables so that (env) can use them

setup_exports()
{
local EXPORT_LST="INSTANCE_HOME SOFTWARE_HOME ZOPE_HOME FORCE_PRODUCT_LOAD \
PROFILE_PUBLISHER SUPPRESS_ACCESSRULE SUPPRESS_SITEROOT CLIENT_HOME \
ZEO_CLIENT EVENT_LOG_FORMAT EVENT_LOG_FILE EVENT_LOG_SEVERITY ZSYSLOG \
ZSYSLOG_FACILITY ZSYSLOG_SERVER ZSYSLOG_ACCESS ZSYSLOG_ACCESS_FACILITY \
ZSYSLOG_ACCESS_SERVER Z_DEBUG_MODE Z_REALM NO_SECURITY ZOPE_SECURITY_POLICY \
ZSP_OWNEROUS_SKIP ZSP_AUTHENTICATED_SKIP DISALLOW_LOCAL_PRODUCTS \
ZOPE_DATABASE_QUOTA ZOPE_READ_ONLY ZSESSION_ADD_NOTIFY ZSESSION_DEL_NOTIFY \
ZSESSION_TIMEOUT_MINS ZSESSION_OBJECT_LIMIT WEBDAV_SOURCE_PORT_CLIENTS \
STX_DEFAULT_LEVEL ZOPE_DTML_REQUEST_AUTOQUOTE Z_MAX_STACK_SIZE \
FORCE_PRODUCT_RELOAD"

for N in $EXPORT_LST ; do
    if [ -n "${N}" ] ; then export ${N} ; fi
done
}

# Check if the file exist. then send file to stdout.
# Parameters:
#    $1 = /path/to/pid.file
# Outputs:

read_pid()
{
    if [ -f "${1}" ] ; then
	cat ${1}
    fi
}

# Check if we have a living PID, if not delete the PID FILE
# Parameters:
#    $1 = /path/to/pid.file
# Returns:
#    0 if alive pid file remains
#    1 if dead pid file removed
#    2 if no pid file found


check_pid_status()
{
    local RESULT=2   # assume no pid file will be found
    local PID=$(read_pid ${1})

    if [ -n "${PID}" ] ; then
	ps --no-headers ${PID} > /dev/null 2>&1
	if [ "${?}" -eq 0 ] ; then
	    RESULT=0
	else
	    rm -f ${1} 
	    RESULT=1
	fi
    fi

    return ${RESULT}
}

# Parameters: 
#    None
# Returns:
#    0 true 
#    1 false and echos /pathname/to/pid/file

is_zope_dead()
{
    local RESULT=

    if [ -n "${INSTANCE_HOME}" ] ; then
	loc=${INSTANCE_HOME}
    else
	loc=${ZOPE_HOME}
    fi

    check_pid_status ${loc}/var/Z2.pid
    RESULT=${?}
    if [ "${RESULT}" -eq 0 ] ; then 
	echo "${loc}"
	RESULT=10
	break    # found a live pid
    fi

    if [ "${RESULT}" -eq 10 ] ; then
	RESULT=1
    else
	RESULT=0
    fi

    return ${RESULT}
}

status()
{ 

    if is_zope_dead ; then
	eerror "--> Zope is dead."
    else
	einfo "--> Zope is alive."
    fi

    return ! is_zope_dead
}

# If Zope is dead, remove PID file and start zope.
# The idea with 'env' is that a environment snapshot
# (current vars + /etc/conf.d/zope?) is created for zope to use.

start_zope()
{
    local RESULT=

    is_zope_dead >/dev/null
    RESULT=${?}
    if [ "${RESULT}" -eq 0 ] ; then
	setup_exports
	umask 077    # Recommended by Zope
	env /usr/bin/python ${ZOPE_HOME}z2.py ${ZOPE_OPTS} &         
	RESULT=${?}
    else
	echo 'Zope is running independant of RC management.'
	echo 'We are going to try and  kill it.'
	stop_zope
	if [ "${?}" -eq 0 ] ; then
	    echo 'Successfully killed zope. Try to start zope again'
	fi
    fi

    return ${RESULT}
}

# If Zope is alive, kill it.

stop_zope()
{
    local PID=$(is_zope_dead)

    if [ -n "${PID}" ] ; then
	kill $(cat ${PID}/var/Z2.pid)    # Not sure if kill always succeeds, so not removeing .pid file.
    fi
    return $?
}

# 

start()
{
    ebegin "Starting zope"
    start_zope
    eend $? "Failed to start zope"
}

#

stop()
{
    ebegin "Stopping zope"
    stop_zope
    eend $? "Failed to stop zope"
}