diff --git a/support/apachectl.in b/support/apachectl.in index 3281c2e..eb0e7b7 100644 --- a/support/apachectl.in +++ b/support/apachectl.in @@ -45,8 +45,9 @@ ARGV="$@" HTTPD='@exp_sbindir@/@progname@' # # pick up any necessary environment variables -if test -f @exp_sbindir@/envvars; then - . @exp_sbindir@/envvars +ENVVARS="@exp_sbindir@/envvars" +if test -f "$ENVVARS"; then + . "$ENVVARS" fi # # a command that outputs a formatted text version of the HTML at the @@ -66,19 +67,207 @@ ULIMIT_MAX_FILES="@APACHECTL_ULIMIT@" # -------------------- -------------------- # |||||||||||||||||||| END CONFIGURATION SECTION |||||||||||||||||||| +# Source function library. +. /etc/init.d/functions +SourceIfExists /etc/sysconfig/httpd2 + +# Set HTTPD=httpd2.worker in /etc/sysconfig/httpd2 to use a server +# with the thread-based "worker" MPM; BE WARNED that some modules may not +# work correctly with a thread-based MPM; notably PHP will refuse to start. +name=`echo $HTTPD | sed -r '\@^.*/[^/[:space:]]+[[:space:]]*$@s@^.*/([^/[:space:]]+)[[:space:]]*$@\1@'` +BINARY=/usr/sbin/$name +BASENAME="$(basename "$BINARY")" +moduledir=/usr/lib64/apache2/modules +moduleargs= +PIDFILE=/var/run/httpd2/httpd.pid +PIDFILE_A1=/var/run/httpd.pid +PIDFILE_A1_PERL=/var/run/httpd-perl.pid +LOCKFILE=/var/lock/subsys/httpd2 +RETVAL=0 + +export TMPDIR=/var/spool/apache2/tmp + +# For check vars +numcheck() { + head -n 1 \ + | grep -q '^[[:space:]]*0*[1-9][0-9]*[[:space:]]*$' +} + +# Check vars +if ! echo "$WAITSTOP" | numcheck ; then + WAITSTOP=300 +fi +if ! echo "$WAITGRACEFULSTOP" | numcheck ; then + WAITGRACEFULSTOP=3000 +fi +if ! echo "$USLEEPSTART" | numcheck ; then + USLEEPSTART=300000 +fi +if ! echo "$LOOPSSTART" | numcheck ; then + LOOPSSTART=10 +fi + +### Hacks for the apache1 + proxified apache2 +if [ -e "$PIDFILE_A1" -o -e "$PIDFILE_A1_PERL" ]; then + DEFINE="-DA1PROXIED" +fi + # Set the maximum number of file descriptors allowed per child process. if [ "x$ULIMIT_MAX_FILES" != "x" ] ; then $ULIMIT_MAX_FILES fi +# Change the major functions into functions. +moduleargs() { + for module in ${moduledir}/*.so ; do + if [ -x ${module} ] ; then + module=`echo ${module} | + sed -e 's/.*\///g; s/^mod_//g; s/^lib//g; s/\.so//g;'| + tr '[:lower:]' '[:upper:]'` + moduleargs="${moduleargs} -DHAVE_$module" + fi + done + echo ${moduleargs} +} + +configtest() { + "$BINARY" -t `moduleargs` $OPTIONS $DEFINE + RETVAL=$? + return $RETVAL +} + +start() +{ + initlog $INITLOG_ARGS -n "$BASENAME" -c "limited -n $BASENAME -- $BINARY -k start $OPTIONS $DEFINE" || : + poststart + RETVAL=$? + return $RETVAL +} + +stop() +{ + if initlog $INITLOG_ARGS -n "$BASENAME" -c "limited -n $BASENAME -- $BINARY -k stop $OPTIONS $DEFINE"; then + usleep 100000 + poststop + RETVAL=$? + else + RETVAL=$? + fi + return $RETVAL +} + +graceful_stop() +{ + if initlog $INITLOG_ARGS -n "$BASENAME" -c "limited -n $BASENAME -- $BINARY -k graceful-stop $OPTIONS $DEFINE"; then + sleep 1 + poststop + RETVAL=$? + else + RETVAL=$? + fi + return $RETVAL +} + +briefstatus() +{ + status --pidfile "$PIDFILE" --expect-user root \ + --expect-user root --name $name -- $BINARY + RETVAL=$? + return $RETVAL +} + +poststart() +{ + for (( i=$LOOPSSTART; $i>0; i=(($i-1)) )); do + usleep $USLEEPSTART + if briefstatus >/dev/null 2>&1; then + touch "$LOCKFILE" + RETVAL=$? + break + else + RETVAL=$? + fi + done + return $RETVAL +} + +poststop() +{ + if ! briefstatus >/dev/null 2>&1; then + rm -f "$LOCKFILE" + RETVAL=$? + else + RETVAL=255 + printf "Service %s has not stopped.\n" "$name" + fi + return $RETVAL +} + +fullstatus() +{ + if briefstatus >/dev/null 2>&1; then + RETVAL=$? + $LYNX $STATUSURL + else + RETVAL=$? + msg_not_running "$name" + echo + fi + return $RETVAL +} + +stop_wait() +{ + for (( i=$1; $i>0; i=(($i-1)) )); do + poststop >/dev/null 2>&1 + RETVAL=$? + if [ $RETVAL -eq 255 ]; then + sleep 1 + else + return $RETVAL + fi + done + poststop >/dev/null 2>&1 + RETVAL=$? + return $RETVAL +} + ERROR=0 if [ "x$ARGV" = "x" ] ; then ARGV="-h" fi case $ACMD in -start|stop|restart|graceful|graceful-stop) - $HTTPD -k $ARGV +start) + start + ERROR=$? + ;; +stop) + stop + ERROR=$? + ;; +graceful-stop) + graceful_stop + ERROR=$? + ;; +wait-stop) + stop + ERROR=$? + if [ $RETVAL -eq 255 ]; then + stop_wait $WAITSTOP + ERROR=$? + fi + ;; +wait-graceful-stop) + graceful_stop + ERROR=$? + if [ $RETVAL -eq 255 ]; then + stop_wait $WAITGRACEFULSTOP + ERROR=$? + fi + ;; +restart|graceful) + initlog $INITLOG_ARGS -n "$BASENAME" -c "limited -n $BASENAME -- $BINARY -k $ARGV $OPTIONS $DEFINE" ERROR=$? ;; startssl|sslstart|start-SSL) @@ -87,18 +276,32 @@ startssl|sslstart|start-SSL) echo and then use "apachectl start". ERROR=2 ;; +poststart) + poststart + ERROR=$? + ;; +poststop) + poststop + ERROR=$? + ;; configtest) - $HTTPD -t + configtest + ERROR=$? + ;; +briefstatus) + briefstatus ERROR=$? ;; status) - $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } ' + fullstatus | awk ' /process$/ { print; exit } { print } ' + ERROR=$? ;; fullstatus) - $LYNX $STATUSURL + fullstatus + ERROR=$? ;; *) - $HTTPD "$@" + initlog -n "$BASENAME" -c "limited -n $BASENAME -- $BINARY $ARGV $OPTIONS $DEFINE" ERROR=$? esac diff --git a/support/Makefile.in b/support/Makefile.in index 745d86c..0283b38 100644 --- a/support/Makefile.in +++ b/support/Makefile.in @@ -3,8 +3,9 @@ DISTCLEAN_TARGETS = apxs apachectl dbmmanage log_server_status \ CLEAN_TARGETS = suexec -bin_PROGRAMS = htpasswd htdigest htdbm ab logresolve httxt2dbm -sbin_PROGRAMS = htcacheclean rotatelogs $(NONPORTABLE_SUPPORT) +bin_PROGRAMS = htpasswd htdigest htdbm ab logresolve httxt2dbm check_forensic +sbin_PROGRAMS = htcacheclean rotatelogs $(NONPORTABLE_SUPPORT) \ + a2chkconfig a2chkconfig_list a2disextra a2dismod a2disport a2dissite a2enextra a2enmod a2enport a2ensite TARGETS = $(bin_PROGRAMS) $(sbin_PROGRAMS) PROGRAM_LDADD = $(UTIL_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) $(AP_LIBS)