#!/bin/bash # # chkconfig: 345 85 15 # description: Plesk Interface and Utilities # processname: httpsd # config: /usr/local/psa/admin/conf/httpsd.conf # config: /usr/local/psa/admin/conf/httpsd.include # pidfile: /usr/local/psa/admin/logs/httpsd.pid # # Startup script for the Plesk # # Following comments are required for SuSE Linux # ### BEGIN INIT INFO # Provides: plesk psa # Required-Start: $remote_fs $time # Required-Stop: # X-UnitedLinux-Should-Start: # X-UnitedLinux-Should-Stop: # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Description: Start the Plesk Server Administrator ### END INIT INFO # # p_echo() { echo "$*" } PRODUCT_NAME="Plesk" PRODNAME="psa" PRODUCT_ROOT_D="/usr/local/psa" MYSQL_BIN_D="/usr/bin" daemon_name=httpsd rc_d="/etc/init.d" # Source function library. [ -f ${rc_d}/functions ] && . ${rc_d}/functions # Source networking configuration. [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network # Source subsystem configuration. [ -f /etc/sysconfig/$PRODNAME ] && . /etc/sysconfig/$PRODNAME # this way is for SuSE Linux test -s /etc/rc.status && . /etc/rc.status && rc_reset ## VZA this directory exists only in SVE vza_file=/var/vzagent admin_passwd="`cat /etc/$PRODNAME/.$PRODNAME.shadow`" lockdir="/var/lock/subsys" optional_service="postgresql" optional_service_wo_lock="${PRODNAME}-spamassassin" tomcat_service="tomcat5" httpd_service="httpd" named_service="named" start_sh=${PRODUCT_ROOT_D}/admin/bin/httpsdctl proccess=admin/bin/httpsd LOCKDIR_AVAILABLE="Yes" if [ -e "$vza_file" ]; then service="mysqld" else service="${named_service} mysqld qmail courier-imap" fi #set openssl config OPENSSL_CONF="${PRODUCT_ROOT_D}/admin/conf/openssl.cnf" export OPENSSL_CONF #set language LANG=C export LANG if [ -x ${rc_d}/xinetd ]; then inetd=xinetd elif [ -x ${rc_d}/inet ]; then inetd=inet elif [ -x ${rc_d}/openbsd-inetd ]; then inetd=openbsd-inetd elif [ -x ${rc_d}/inetd ]; then inetd=inetd else echo "It is problem with inet daemon" exit 1 fi get_my_cnf_param() { local my_cnf cnf_files cnf_files="/etc/my.cnf /etc/mysql/my.cnf /var/db/mysql/my.cnf" for my_cnf in ${cnf_files}; do if [ -f ${my_cnf} ]; then break fi done [ -f ${my_cnf} ] && r=`perl -e '$p="'"$1"'"; undef $/; $_=<>; s/#.*$//gm; /\[mysqld\](.*?)\[/sg; $_=substr($1, rindex $1,"$p") and /$p\s*=(.*)/m and print $1 ' ${my_cnf}` echo $r } setenv_mysql() { mysqlsock=`get_my_cnf_param socket` if [ -S "$mysqlsock" ]; then MYSQL_UNIX_PORT=$mysqlsock && export MYSQL_UNIX_PORT else for i in $MYSQL_SOCKETS do if [ -S "$i" ]; then MYSQL_UNIX_PORT=$i export MYSQL_UNIX_PORT break fi done fi } clean_sessions() { #VZP should we clean sessions on target VE? if [ -e "$vza_file" ]; then return fi if [ "X$admin_passwd" != "X" ]; then query="delete from sessions" echo "$query" | "$MYSQL_BIN_D/mysql" -u admin -p"$admin_passwd" $PRODNAME rm -f ${PRODUCT_ROOT_D}/admin/sessions/* fi } define_virusfilter() { if [ "X$admin_passwd" != "X" ]; then query="select val from misc where param='virusfilter'" virusfilter_val=`echo "$query" | "$MYSQL_BIN_D/mysql" -N -u admin -p"$admin_passwd" $PRODNAME` fi case $virusfilter_val in kav) virusfilter_service="aveserver" ;; drweb) virusfilter_service="drwebd" ;; *) virusfilter_service="" ;; esac } rc_syntax() { if test -z "$LINES" -o -z "$COLUMNS" ; then eval `exec 3<&1; stty size <&3 2>/dev/null | (read L C; \ echo LINES=${L:-24} COLUMNS=${C:-80})` fi if test -t 1 -a "$TERM" != "raw" -a "$TERM" != "dumb" && stty size <&1 > /dev/null 2>&1 ; then esc=`echo -en "\033"` extd="${esc}[1m" warn="${esc}[1;31m" attn="${esc}[1;33m" norm=`echo -en "${esc}[m\017"` stat=`echo -en "\015${esc}[${COLUMNS}C${esc}[10D"` done="${esc}[1;32m" else esc="" extd="" warn="" attn="" norm="" stat="" done="" fi rc_done="${stat}${done}done${norm}" rc_started="${stat}${done}already started${norm}" rc_stopped="${stat}${done}already stopped${norm}" rc_not_installed="${stat}${extd}not installed${norm}" rc_failed="${stat}${warn}failed${norm}" } fix_apache_range() { apahce_cfg="${PRODUCT_ROOT_D}/admin/conf/httpsd.conf" sed -e "s/^RewriteCond\ %{REQUEST_METHOD}\ \^TRACE$//g" -e "/^$/ { s/^RewriteRule .\* \- \[F\]$//g; }" -e "s/^RewriteCond %{HTTP:range}\(.*\)$//g" -e "s/<\/VirtualHost>/RewriteCond %{HTTP:range} \!\(^bytes=[^,]+\(,[^,]+\){0,4}\$|^\$\)\nRewriteRule \.\* \- \[F\]\nRewriteCond %{REQUEST_METHOD} \^TRACE\nRewriteRule \.\* \- \[F\]\n<\/VirtualHost>/g" < $apahce_cfg > $apahce_cfg.range ERR=$? if [ $ERR = 0 ]; then mv $apahce_cfg.range $apahce_cfg sed -e :a\;N\;\$\!ba\;s/\\n\\n\\n/\\n/g < $apahce_cfg > $apahce_cfg.range ERR=$? if [ $ERR = 0 ]; then mv $apahce_cfg.range $apahce_cfg; fi; fi } get_pids_byname() { proc_name="$1" PIDS=`ps axww | awk '$5 ~ "'$proc_name'$" {print $1}'` echo $PIDS } wait_after_stop() { PIDS=`echo "$1" | tr ' ' ,` count=${2:=50} for i in `seq $count`; do ps -p $PIDS > /dev/null 2>&1 || break [ 0$i -eq 0$count ] && kill -9 $1 > /dev/null 2>&1 sleep 1 done return 0 } service_start() { local serv_list="$1" for i in $serv_list; do echo -n "Starting $i service... " if [ -f ${rc_d}/$i ]; then if [ ! -f ${lockdir}/$i ]; then ${rc_d}/$i start > /dev/null 2>&1 res=$? fi [ 0$res -eq 0 ] && echo "$rc_done" || echo "$rc_failed" else echo "$rc_not_installed" fi done } service_stop() { local serv_list="$1" local lock_flag="$2" for i in $serv_list; do echo -n "Stopping $i service... " if [ -f ${rc_d}/$i ]; then if [ -f ${lockdir}/$i -o "X$lock_flag" = "XNo" ]; then ${rc_d}/$i stop > /dev/null 2>&1 res=$? fi [ 0$res -eq 0 ] && echo "$rc_done" || echo "$rc_failed" else echo "$rc_not_installed" fi done } start_service() { local apache_started=0 service_start "$inetd $service $optional_service $optional_service_wo_lock" query="SELECT COUNT(*) FROM DomainServices WHERE type='tomcat' AND status=0" active_ds=`echo "$query" | "$MYSQL_BIN_D/mysql" -u admin -p"$admin_passwd" -N $PRODNAME | cat` if [ 0$active_ds -gt 0 ]; then for i in $tomcat_service; do if [ -f ${rc_d}/$i -a ! -f ${lockdir}/$i ]; then ${PRODUCT_ROOT_D}/admin/sbin/websrvmng -t -r -v apache_started=1 fi done fi for i in $httpd_service; do if [ 0$apache_started -eq 0 -a -f ${rc_d}/$i -a ! -f ${lockdir}/$i ]; then ${PRODUCT_ROOT_D}/admin/sbin/websrvmng -p -v fi done } stop_service(){ stop define_virusfilter service_stop "$service $optional_service" "$LOCKDIR_AVAILABLE" service_stop "$optional_service_wo_lock $virusfilter_service" "No" service_stop "$tomcat_service" "$LOCKDIR_AVAILABLE" service_stop "$httpd_service" "$LOCKDIR_AVAILABLE" $PRODUCT_ROOT_D/bin/apache_cleanup.sh } start1(){ echo -n "Starting ${PRODUCT_NAME}... " ${start_sh} start >> /dev/null 2>&1 ret="$?" if [ 0$ret -eq 0 ]; then [ -d ${lockdir} ] && touch "$lockdir/$PRODNAME" ${PRODUCT_ROOT_D}/admin/bin/packagemng --set-dirty-flag echo "$rc_done" else echo "$rc_failed" return 1 fi return 0 } make_lockdir() { local plesk_lock_dir="/var/lock/files" [ -d "$plesk_lock_dir" ] || mkdir -p $plesk_lock_dir } start(){ make_lockdir start_service sleep 1 clean_sessions start1 sleep 1 define_virusfilter service_start "$virusfilter_service" } stop(){ echo -n "Stopping ${PRODUCT_NAME}... " if [ -f "$lockdir/$PRODNAME" ]; then ${start_sh} stop >/dev/null 2>&1 wait_after_stop "`get_pids_byname $proccess`" 100 ret=$? if [ 0$ret -eq 0 ]; then rm -f "$lockdir/$PRODNAME" echo "$rc_done" else echo "$rc_failed" return 1 fi else ${start_sh} stop > /dev/null 2>&1 echo "$rc_done" fi return 0 } restart(){ status $PRODNAME ${daemon_name} > /dev/null 2>&1 case $? in 0) fix_apache_range ${start_sh} restart > /dev/null 2>&1 ret=$? clean_sessions [ $ret -eq 0 ] && ${PRODUCT_ROOT_D}/admin/bin/packagemng --set-dirty-flag ;; *) echo "PSA is down, performing full restart. " start ;; esac } reload(){ [ -e "$lockdir/$PRODNAME" ] && ${start_sh} reload } # this routine is psa specific override of standard status function status() { local base=${1##*/} local dbase=${2##*/} local pid # Test syntax. if [ $# = 0 ] ; then echo $"Usage: status {service name} {daemon name}" return 1 fi # First try "pidof" pid=`pidof -o $$ -o $PPID -o %PPID -x $2 || \ pidof -o $$ -o $PPID -o %PPID -x ${dbase}` if [ "$pid" != "" ] ; then echo $"${dbase} (pid $pid) is running..." return 0 fi # Next try "/var/run/*.pid" files if [ -f /var/run/${base}.pid ] ; then read pid < /var/run/${base}.pid if [ "$pid" != "" ] ; then echo $"${base} dead but pid file exists" return 1 fi fi # See if /var/lock/subsys/${base} exists if [ -f /var/lock/subsys/${base} ]; then echo $"${base} dead but subsys locked" return 2 fi echo $"${base} is stopped" return 3 } rc_syntax setenv_mysql # See how we were called. case "$1" in start) start ;; start1) start1 ;; startall) start_service ;; stop) stop ;; stop1) stop ;; stopall) stop_service ;; status) status $PRODNAME ${daemon_name} ;; reload) reload ;; restart) restart ;; restart1) stop start1 ;; *) echo $"Usage: $0 {start|stop|startall|stopall|restart|status}" exit 1 esac exit $?