#!/bin/sh
#
# $Id$
#

# PROVIDE: looper
# REQUIRE: LOGIN
# BEFORE:  securelevel
# KEYWORD: shutdown

. /etc/rc.subr

case "$0" in
	/etc/rc*)
		name=$(basename "$_file" .sh)
		startup_script="$_file"
		;;
	*)
		name=$(basename "$0" .sh)
		startup_script="/usr/local/etc/rc.d/$(basename "$0")"
		;;
esac

name_loop="${name}_loop"
rcvar="${name}_enable"

# Read configuration and set defaults
load_rc_config "${name}"

: ${arcd_enable="YES"}
: ${arcd_user="websearch"}
: ${arcd_port="18030"}
: ${arcd_chdir="/place/${name}"}
: ${arcd_program="/Berkanavt/database/bin/arcdaemon"}
: ${arcd_flags="-t 1 -l ${arcd_chdir}/logs/${name}.log"}
: ${arcd_pid_file="${arcd_chdir}/run/${name}.pid"}
: ${arcd_pid_file_loop="${arcd_chdir}/run/${name}-loop.pid"}
: ${arcd_out_log="${arcd_chdir}/logs/${name}.out"}
: ${arcd_err_log="${arcd_chdir}/logs/${name}.err"}
: ${arcd_loop_log="${arcd_chdir}/logs/${name}-loop.log"}
: ${arcd_limits_args="-e -B -C worm"}
: ${arcd_reopenlog_command="fetch -qo /dev/null 'http://localhost:${arcd_port}/ctl?reopenlog'"}

: ${arcd_test_enable="YES"}
: ${arcd_test_user="websearch"}
: ${arcd_test_port="18039"}
: ${arcd_test_chdir="/place/arcd"}
: ${arcd_test_program="/Berkanavt/database/bin/arcdaemon"}
: ${arcd_test_flags="-t 1 -l ${arcd_test_chdir}/logs/${name}.log -p ${arcd_test_port} -y test"}
: ${arcd_test_pid_file="${arcd_test_chdir}/run/${name}.pid"}
: ${arcd_test_pid_file_loop="${arcd_test_chdir}/run/${name}-loop.pid"}
: ${arcd_test_out_log="${arcd_test_chdir}/logs/${name}.out"}
: ${arcd_test_err_log="${arcd_test_chdir}/logs/${name}.err"}
: ${arcd_test_loop_log="${arcd_test_chdir}/logs/${name}-loop.log"}
: ${arcd_test_limits_args="-e -B -C worm"}
: ${arcd_test_reopenlog_command="fetch -qo /dev/null 'http://localhost:${arcd_test_port}/ctl?reopenlog'"}

: ${balancer_enable="NO"}
: ${balancer_user="websearch"}
: ${balancer_port="8080"}
: ${balancer_chdir="/hol/arkanavt/${name}"}
: ${balancer_program="${balancer_chdir}/${name}"}
: ${balancer_flags="${balancer_chdir}/${name}.cfg"}
: ${balancer_pid_file="${balancer_chdir}/pids/${name}.pid"}
: ${balancer_pid_file_loop="${balancer_chdir}/pids/${name}-loop.pid"}
: ${balancer_out_log="${balancer_chdir}/logs/${name}.out"}
: ${balancer_err_log="${balancer_chdir}/logs/${name}.err"}
: ${balancer_loop_log="${balancer_chdir}/logs/${name}-loop.log"}
: ${balancer_limits_args="-e -B -C yandex"}
#if [ -z ${balancer_stop_precommand} ]; then
#  balancer_stop_precommand="ports=''; for port in \$(fetch -o -  'http://localhost:${balancer_port}/admin?action=show_listen' 2>/dev/null | sed 's|<ip>[\.[:digit:]]*</ip>||g' | sed 's|<[[:alpha:]/]*>| |g '); do if [ -z  \"\${ports}\" ]; then ports=\${port}; else ports=\"\${ports},\${port}\";  fi; done; ipfw -q add 100 reset tcp from 10.0.0.1 to me \${ports} setup && sleep 10"
#fi
#: ${balancer_stop_precommand="ipfw -q add 100 reset tcp from 10.0.0.1 to me ${balancer_port} setup && sleep 10"}
: ${balancer_stop_command="fetch -q -o - http://localhost:${balancer_port}/admin?action=shutdown"}
#: ${balancer_stop_postcommand="ipfw -q delete 100"}
: ${balancer_reload_precommand="${balancer_stop_precommand}"}
#: ${balancer_reload_command="${balancer_stop_command}"}
: ${balancer_reload_postcommand="while ! nc -z localhost ${balancer_port}; do sleep 2; done && ${balancer_stop_postcommand}"}

: ${clicks_balancer_enable="NO"}
: ${clicks_balancer_user="websearch"}
: ${clicks_balancer_port="18100"}
: ${clicks_balancer_chdir="/hol/arkanavt/${name}"}
: ${clicks_balancer_program="${clicks_balancer_chdir}/${name}"}
: ${clicks_balancer_flags="${clicks_balancer_chdir}/${name}.cfg"}
: ${clicks_balancer_pid_file="${clicks_balancer_chdir}/pids/${name}.pid"}
: ${clicks_balancer_pid_file_loop="${clicks_balancer_chdir}/pids/${name}-loop.pid"}
: ${clicks_balancer_out_log="${clicks_balancer_chdir}/logs/${name}.out"}
: ${clicks_balancer_err_log="${clicks_balancer_chdir}/logs/${name}.err"}
: ${clicks_balancer_loop_log="${clicks_balancer_chdir}/logs/${name}-loop.log"}
: ${clicks_balancer_limits_args="-e -B -C yandex"}
: ${clicks_balancer_stop_precommand="ipfw -q add 101 reset tcp from 10.0.0.1 to me ${clicks_balancer_port} setup && sleep 10"}
#: ${clicks_balancer_stop_command="fetch -q -o - http://localhost:${clicks_balancer_port}/admin?action=shutdown"}
: ${clicks_balancer_stop_postcommand="ipfw -q delete 101"}
: ${clicks_balancer_reload_precommand="${clicks_balancer_stop_precommand}"}
#: ${clicks_balancer_reload_command="${clicks_balancer_stop_command}"}
: ${clicks_balancer_reload_postcommand="while ! nc -z localhost ${clicks_balancer_port}; do sleep 2; done && ${clicks_balancer_stop_postcommand}"}

: ${news_balancer_enable="NO"}
: ${news_balancer_user="websearch"}
: ${news_balancer_port="17040"}
: ${news_balancer_chdir="/hol/arkanavt/${name}"}
: ${news_balancer_program="${news_balancer_chdir}/${name}"}
: ${news_balancer_flags="${news_balancer_chdir}/${name}.cfg"}
: ${news_balancer_pid_file="${news_balancer_chdir}/pids/${name}.pid"}
: ${news_balancer_pid_file_loop="${news_balancer_chdir}/pids/${name}-loop.pid"}
: ${news_balancer_out_log="${news_balancer_chdir}/logs/${name}.out"}
: ${news_balancer_err_log="${news_balancer_chdir}/logs/${name}.err"}
: ${news_balancer_loop_log="${news_balancer_chdir}/logs/${name}-loop.log"}
: ${news_balancer_limits_args="-e -B -C yandex"}
: ${news_balancer_stop_precommand="ipfw -q add 102 reset tcp from 10.0.0.1 to me ${news_balancer_port} setup && sleep 10"}
#: ${news_balancer_stop_command="fetch -q -o - http://localhost:${news_balancer_port}/admin?action=shutdown"}
: ${news_balancer_stop_postcommand="ipfw -q delete 102"}
: ${news_balancer_reload_precommand="${news_balancer_stop_precommand}"}
#: ${news_balancer_reload_command="${news_balancer_stop_command}"}
: ${news_balancer_reload_postcommand="while ! nc -z localhost ${news_balancer_port}; do sleep 2; done && ${news_balancer_stop_postcommand}"}

: ${reqwizard_balancer_enable="YES"}
: ${reqwizard_balancer_user="websearch"}
: ${reqwizard_balancer_port="8891"}
: ${reqwizard_balancer_chdir="/hol/arkanavt/${name}"}
: ${reqwizard_balancer_program="${reqwizard_balancer_chdir}/${name}"}
: ${reqwizard_balancer_flags="${reqwizard_balancer_chdir}/${name}.cfg"}
: ${reqwizard_balancer_pid_file="${reqwizard_balancer_chdir}/pids/${name}.pid"}
: ${reqwizard_balancer_pid_file_loop="${reqwizard_balancer_chdir}/pids/${name}-loop.pid"}
: ${reqwizard_balancer_out_log="${reqwizard_balancer_chdir}/logs/${name}.out"}
: ${reqwizard_balancer_err_log="${reqwizard_balancer_chdir}/logs/${name}.err"}
: ${reqwizard_balancer_loop_log="${reqwizard_balancer_chdir}/logs/${name}-loop.log"}
: ${reqwizard_balancer_limits_args="-e -B -C yandex"}
: ${reqwizard_balancer_stop_precommand="ipfw -q add 103 reset tcp from 10.0.0.1 to me ${reqwizard_balancer_port} setup && sleep 10"}
#: ${reqwizard_balancer_stop_command="fetch -q -o - http://localhost:${reqwizard_balancer_port}/admin?action=shutdown"}
: ${reqwizard_balancer_stop_postcommand="ipfw -q delete 103"}
: ${reqwizard_balancer_reload_precommand="${reqwizard_balancer_stop_precommand}"}
#: ${reqwizard_balancer_reload_command="${reqwizard_balancer_stop_command}"}
: ${reqwizard_balancer_reload_postcommand="while ! nc -z localhost ${reqwizard_balancer_port}; do sleep 2; done && ${reqwizard_balancer_stop_postcommand}"}

: ${addrs_balancer_enable="YES"}
: ${addrs_balancer_user="websearch"}
: ${addrs_balancer_port="17140"}
: ${addrs_balancer_chdir="/hol/arkanavt/${name}"}
: ${addrs_balancer_program="${addrs_balancer_chdir}/${name}"}
: ${addrs_balancer_flags="${addrs_balancer_chdir}/${name}.cfg"}
: ${addrs_balancer_pid_file="${addrs_balancer_chdir}/pids/${name}.pid"}
: ${addrs_balancer_pid_file_loop="${addrs_balancer_chdir}/pids/${name}-loop.pid"}
: ${addrs_balancer_out_log="${addrs_balancer_chdir}/logs/${name}.out"}
: ${addrs_balancer_err_log="${addrs_balancer_chdir}/logs/${name}.err"}
: ${addrs_balancer_loop_log="${addrs_balancer_chdir}/logs/${name}-loop.log"}
: ${addrs_balancer_limits_args="-e -B -C yandex"}
: ${addrs_balancer_stop_precommand="ipfw -q add 104 reset tcp from 10.0.0.1 to me ${addrs_balancer_port} setup && sleep 10"}
: ${addrs_balancer_stop_command="fetch -q -o - http://localhost:${addrs_balancer_port}/admin?action=shutdown"}
: ${addrs_balancer_stop_postcommand="ipfw -q delete 104"}
: ${addrs_balancer_reload_precommand="${addrs_balancer_stop_precommand}"}
: ${addrs_balancer_reload_command="${addrs_balancer_stop_command}"}
: ${addrs_balancer_reload_postcommand="while ! nc -z localhost ${addrs_balancer_port}; do sleep 2; done && ${addrs_balancer_stop_postcommand}"}

: ${smetanka_balancer_enable="YES"}
: ${smetanka_balancer_user="websearch"}
: ${smetanka_balancer_port="17000"}
: ${smetanka_balancer_chdir="/hol/arkanavt/${name}"}
: ${smetanka_balancer_program="${smetanka_balancer_chdir}/${name}"}
: ${smetanka_balancer_flags="${smetanka_balancer_chdir}/${name}.cfg"}
: ${smetanka_balancer_pid_file="${smetanka_balancer_chdir}/pids/${name}.pid"}
: ${smetanka_balancer_pid_file_loop="${smetanka_balancer_chdir}/pids/${name}-loop.pid"}
: ${smetanka_balancer_out_log="${smetanka_balancer_chdir}/logs/${name}.out"}
: ${smetanka_balancer_err_log="${smetanka_balancer_chdir}/logs/${name}.err"}
: ${smetanka_balancer_loop_log="${smetanka_balancer_chdir}/logs/${name}-loop.log"}
: ${smetanka_balancer_limits_args="-e -B -C yandex"}
# :${...="..."} scheme does not work here!!! seems that `sh` has limitation in string length here.
if [ -z ${smetanka_balancer_stop_precommand} ]; then
  smetanka_balancer_stop_precommand="ports=''; for port in \$(fetch -o -  'http://localhost:${smetanka_balancer_port}/admin?action=show_listen' 2>/dev/null | sed 's|<ip>[\.[:digit:]]*</ip>||g' | sed 's|<[[:alpha:]/]*>| |g '); do if [ -z  \"\${ports}\" ]; then ports=\${port}; else ports=\"\${ports},\${port}\";  fi; done; ipfw -q add 105 reset tcp from 10.0.0.1 to me \${ports} setup && sleep 10"
fi
: ${smetanka_balancer_stop_command="fetch -q -o - http://localhost:${smetanka_balancer_port}/admin?action=shutdown"}
: ${smetanka_balancer_stop_postcommand="ipfw -q delete 105"}
: ${smetanka_balancer_reload_precommand="${smetanka_balancer_stop_precommand}"}
: ${smetanka_balancer_reload_command="${smetanka_balancer_stop_command}"}
: ${smetanka_balancer_reload_postcommand="while ! nc -z localhost ${smetanka_balancer_port}; do sleep 2; done && ${smetanka_balancer_stop_postcommand}"}

: ${blogs_balancer_enable="YES"}
: ${blogs_balancer_user="websearch"}
: ${blogs_balancer_port="17200"}
: ${blogs_balancer_chdir="/hol/arkanavt/${name}"}
: ${blogs_balancer_program="${blogs_balancer_chdir}/${name}"}
: ${blogs_balancer_flags="${blogs_balancer_chdir}/${name}.cfg"}
: ${blogs_balancer_pid_file="${blogs_balancer_chdir}/pids/${name}.pid"}
: ${blogs_balancer_pid_file_loop="${blogs_balancer_chdir}/pids/${name}-loop.pid"}
: ${blogs_balancer_out_log="${blogs_balancer_chdir}/logs/${name}.out"}
: ${blogs_balancer_err_log="${blogs_balancer_chdir}/logs/${name}.err"}
: ${blogs_balancer_loop_log="${blogs_balancer_chdir}/logs/${name}-loop.log"}
: ${blogs_balancer_limits_args="-e -B -C yandex"}
: ${blogs_balancer_stop_precommand="ipfw -q add 106 reset tcp from 10.0.0.1 to me ${blogs_balancer_port} setup && sleep 10"}
: ${blogs_balancer_stop_command="fetch -q -o - http://localhost:${blogs_balancer_port}/admin?action=shutdown"}
: ${blogs_balancer_stop_postcommand="ipfw -q delete 106"}
: ${blogs_balancer_reload_precommand="${blogs_balancer_stop_precommand}"}
: ${blogs_balancer_reload_command="${blogs_balancer_stop_command}"}
: ${blogs_balancer_reload_postcommand="while ! nc -z localhost ${blogs_balancer_port}; do sleep 2; done && ${blogs_balancer_stop_postcommand}"}

: ${barnavig_balancer_enable="NO"}
: ${barnavig_balancer_user="websearch"}
: ${barnavig_balancer_port="9200"}
: ${barnavig_balancer_chdir="/hol/arkanavt/${name}"}
: ${barnavig_balancer_program="${barnavig_balancer_chdir}/${name}"}
: ${barnavig_balancer_flags="${barnavig_balancer_chdir}/${name}.cfg"}
: ${barnavig_balancer_pid_file="${barnavig_balancer_chdir}/pids/${name}.pid"}
: ${barnavig_balancer_pid_file_loop="${barnavig_balancer_chdir}/pids/${name}-loop.pid"}
: ${barnavig_balancer_out_log="${barnavig_balancer_chdir}/logs/${name}.out"}
: ${barnavig_balancer_err_log="${barnavig_balancer_chdir}/logs/${name}.err"}
: ${barnavig_balancer_loop_log="${barnavig_balancer_chdir}/logs/${name}-loop.log"}
: ${barnavig_balancer_limits_args="-e -B -C yandex"}
: ${barnavig_balancer_stop_precommand="ipfw -q add 107 reset tcp from 10.0.0.1 to me ${barnavig_balancer_port} setup && sleep 10"}
: ${barnavig_balancer_stop_command="fetch -q -o - http://localhost:${barnavig_balancer_port}/admin?action=shutdown"}
: ${barnavig_balancer_stop_postcommand="ipfw -q delete 107"}
: ${barnavig_balancer_reload_precommand="${barnavig_balancer_stop_precommand}"}
: ${barnavig_balancer_reload_command="${barnavig_balancer_stop_command}"}
: ${barnavig_balancer_reload_postcommand="while ! nc -z localhost ${barnavig_balancer_port}; do sleep 2; done && ${barnavig_balancer_stop_postcommand}"}


: ${duckduckgo_balancer_enable="YES"}
: ${duckduckgo_balancer_user="websearch"}
: ${duckduckgo_balancer_port="17600"}
: ${duckduckgo_balancer_chdir="/hol/arkanavt/${name}"}
: ${duckduckgo_balancer_program="${duckduckgo_balancer_chdir}/${name}"}
: ${duckduckgo_balancer_flags="${duckduckgo_balancer_chdir}/${name}.cfg"}
: ${duckduckgo_balancer_pid_file="${duckduckgo_balancer_chdir}/pids/${name}.pid"}
: ${duckduckgo_balancer_pid_file_loop="${duckduckgo_balancer_chdir}/pids/${name}-loop.pid"}
: ${duckduckgo_balancer_out_log="${duckduckgo_balancer_chdir}/logs/${name}.out"}
: ${duckduckgo_balancer_err_log="${duckduckgo_balancer_chdir}/logs/${name}.err"}
: ${duckduckgo_balancer_loop_log="${duckduckgo_balancer_chdir}/logs/${name}-loop.log"}
: ${duckduckgo_balancer_limits_args="-e -B -C yandex"}
: ${duckduckgo_balancer_stop_precommand="ipfw -q add 108 reset tcp from 10.0.0.1 to me ${duckduckgo_balancer_port} setup && sleep 10"}
: ${duckduckgo_balancer_stop_command="fetch -q -o - http://localhost:${duckduckgo_balancer_port}/admin?action=shutdown"}
: ${duckduckgo_balancer_stop_postcommand="ipfw -q delete 108"}
: ${duckduckgo_balancer_reload_precommand="${duckduckgo_balancer_stop_precommand}"}
: ${duckduckgo_balancer_reload_command="${duckduckgo_balancer_stop_command}"}
: ${duckduckgo_balancer_reload_postcommand="while ! nc -z localhost ${duckduckgo_balancer_port}; do sleep 2; done && ${duckduckgo_balancer_stop_postcommand}"}

: ${opensmetanka_balancer_enable="YES"}
: ${opensmetanka_balancer_user="websearch"}
: ${opensmetanka_balancer_port="17001"}
: ${opensmetanka_balancer_chdir="/hol/arkanavt/${name}"}
: ${opensmetanka_balancer_program="${opensmetanka_balancer_chdir}/${name}"}
: ${opensmetanka_balancer_flags="${opensmetanka_balancer_chdir}/${name}.cfg"}
: ${opensmetanka_balancer_pid_file="${opensmetanka_balancer_chdir}/pids/${name}.pid"}
: ${opensmetanka_balancer_pid_file_loop="${opensmetanka_balancer_chdir}/pids/${name}-loop.pid"}
: ${opensmetanka_balancer_out_log="${opensmetanka_balancer_chdir}/logs/${name}.out"}
: ${opensmetanka_balancer_err_log="${opensmetanka_balancer_chdir}/logs/${name}.err"}
: ${opensmetanka_balancer_loop_log="${opensmetanka_balancer_chdir}/logs/${name}-loop.log"}
: ${opensmetanka_balancer_limits_args="-e -B -C yandex"}
# :${...="..."} scheme does not work here!!! seems that `sh` has limitation in string length here.
if [ -z ${opensmetanka_balancer_stop_precommand} ]; then
  opensmetanka_balancer_stop_precommand="ports=''; for port in \$(fetch -o -  'http://localhost:${opensmetanka_balancer_port}/admin?action=show_listen' 2>/dev/null | sed 's|<ip>[\.[:digit:]]*</ip>||g' | sed 's|<[[:alpha:]/]*>| |g '); do if [ -z  \"\${ports}\" ]; then ports=\${port}; else ports=\"\${ports},\${port}\";  fi; done; ipfw -q add 109 reset tcp from 10.0.0.1 to me \${ports} setup && sleep 10"
fi
: ${opensmetanka_balancer_stop_command="fetch -q -o - http://localhost:${opensmetanka_balancer_port}/admin?action=shutdown"}
: ${opensmetanka_balancer_stop_postcommand="ipfw -q delete 109"}
: ${opensmetanka_balancer_reload_precommand="${opensmetanka_balancer_stop_precommand}"}
: ${opensmetanka_balancer_reload_command="${opensmetanka_balancer_stop_command}"}
: ${opensmetanka_balancer_reload_postcommand="while ! nc -z localhost ${opensmetanka_balancer_port}; do sleep 2; done && ${opensmetanka_balancer_stop_postcommand}"}


: ${hilitedaemon_enable="YES"}
: ${hilitedaemon_user="websearch"}
: ${hilitedaemon_port="9100"}
: ${hilitedaemon_chdir="/hol/hilitedaemon"}
: ${hilitedaemon_program="${hilitedaemon_chdir}/bin/hilitedaemon"}
: ${hilitedaemon_flags="-L -p ${hilitedaemon_port} -x 1 -i ${hilitedaemon_chdir}/infected/infected_hosts" -l /Berkanavt/bin/phconfig}
: ${hilitedaemon_pid_file="${hilitedaemon_chdir}/pids/${name}.pid"}
: ${hilitedaemon_pid_file_loop="${hilitedaemon_chdir}/pids/${name}-loop.pid"}
: ${hilitedaemon_loop_log="${hilitedaemon_chdir}/logs/${name}-loop.log"}
#: ${hilitedaemon_err_log="${hilitedaemon_chdir}/logs/${name}-err.log"}
: ${hilitedaemon_check_group="+MISC_HILITED"}
: ${hilitedaemon_start_postcommand="while ! nc -z localhost ${hilitedaemon_port}; do sleep 2; done"}
: ${hilitedaemon_stop_precommand="ipfw -q add 200 reset tcp from 10.0.0.1 to me ${hilitedaemon_port} setup && sleep 5"}
: ${hilitedaemon_stop_command="fetch -q -o - http://localhost:${hilitedaemon_port}/ctl?stop"}
: ${hilitedaemon_stop_postcommand="ipfw -q delete 200"}
: ${hilitedaemon_reload_precommand="${hilitedaemon_stop_precommand}"}
: ${hilitedaemon_reload_command="${hilitedaemon_stop_command}"}
: ${hilitedaemon_reload_postcommand="${hilitedaemon_start_postcommand} && ${hilitedaemon_stop_postcommand}"}

: ${barnav_enable="YES"}
: ${barnav_user="websearch"}
: ${barnav_port="9200"}
: ${barnav_chdir="/hol/barnav"}
: ${barnav_program="${barnav_chdir}/bin/userspy"}
: ${barnav_flags="-p ${barnav_port} -n 800 -q 800 -c 2000 -d ${barnav_chdir}/logs -s ${barnav_chdir}/data -k ${barnav_chdir}/pubkey.pem"}
: ${barnav_pid_file="${barnav_chdir}/pids/${name}.pid"}
: ${barnav_pid_file_loop="${barnav_chdir}/pids/${name}-loop.pid"}
: ${barnav_err_log="${barnav_chdir}/logs/${name}.out"}
: ${barnav_out_log="${barnav_chdir}/logs/${name}.err"}
: ${barnav_loop_log="${barnav_chdir}/logs/${name}-loop.log"}
: ${barnav_check_group="+MISC_BARNAV"}
: ${barnav_start_postcommand="while ! nc -z localhost ${barnav_port}; do sleep 2; done"}
: ${barnav_stop_precommand="ipfw -q add 201 reset tcp from 10.0.0.1 to me ${barnav_port} setup && sleep 5"}
: ${barnav_stop_command="fetch -q -o - http://localhost:${barnav_port}/admin?action=shutdown"}
: ${barnav_stop_postcommand="ipfw -q delete 201"}
: ${barnav_reload_precommand="${barnav_stop_precommand}"}
: ${barnav_reload_command="${barnav_stop_command}"}
: ${barnav_reload_postcommand="${barnav_start_postcommand} && ${barnav_stop_postcommand}"}



: ${slave_newsd_enable="YES"}
: ${slave_newsd_user="websearch"}
: ${slave_newsd_port="17601"}
: ${slave_newsd_chdir="/hol/newsd"}
: ${slave_newsd_program="${slave_newsd_chdir}/bin/slave_newsd"}
: ${slave_newsd_flags=" -p 17602 -L ${slave_newsd_chdir}/logs/newsd.log -s ${slave_newsd_chdir}/snapshots -P ${slave_newsd_port} -c ${slave_newsd_chdir}/etc/my.cnf"}
: ${slave_newsd_pid_file="${slave_newsd_chdir}/pids/${name}.pid"}
: ${slave_newsd_pid_file_loop="${slave_newsd_chdir}/pids/${name}-loop.pid"}
: ${slave_newsd_loop_log="${slave_newsd_chdir}/logs/${name}-loop.log"}
: ${slave_newsd_check_group="+MISC_NEWSD"}
: ${slave_newsd_start_postcommand="while ! nc -z localhost ${slave_newsd_port}; do sleep 2; done"}
#: ${slave_newsd_stop_command="fetch -q -o - http://localhost:${slave_newsd_port}/ctl?stop"}
#: ${slave_newsd_reload_precommand="${slave_newsd_stop_precommand}"}
#: ${slave_newsd_reload_command="${slave_newsd_stop_command}"}
#: ${slave_newsd_reload_postcommand="${slave_newsd_start_postcommand} && ${slave_newsd_stop_postcommand}"}


: ${slave_newsd_tur_enable="YES"}
: ${slave_newsd_tur_user="websearch"}
: ${slave_newsd_tur_port="17603"}
: ${slave_newsd_tur_chdir="/hol/newsd_tur"}
: ${slave_newsd_tur_program="${slave_newsd_tur_chdir}/bin/slave_newsd_tur"}
: ${slave_newsd_tur_flags=" -p 17604 -L ${slave_newsd_tur_chdir}/logs/newsd.log -s ${slave_newsd_tur_chdir}/snapshots -P ${slave_newsd_tur_port} -c ${slave_newsd_tur_chdir}/etc/my.cnf"}
: ${slave_newsd_tur_pid_file="${slave_newsd_tur_chdir}/pids/${name}.pid"}
: ${slave_newsd_tur_pid_file_loop="${slave_newsd_tur_chdir}/pids/${name}-loop.pid"}
: ${slave_newsd_tur_loop_log="${slave_newsd_tur_chdir}/logs/${name}-loop.log"}
: ${slave_newsd_tur_check_group="+MISC_NEWSD_TUR"}
: ${slave_newsd_tur_start_postcommand="while ! nc -z localhost ${slave_newsd_tur_port}; do sleep 2; done"}
#: ${slave_newsd_tur_stop_command="fetch -q -o - http://localhost:${slave_newsd_tur_port}/ctl?stop"}
#: ${slave_newsd_tur_reload_precommand="${slave_newsd_tur_stop_precommand}"}
#: ${slave_newsd_tur_reload_command="${slave_newsd_tur_stop_command}"}
#: ${slave_newsd_tur_reload_postcommand="${slave_newsd_tur_start_postcommand} && ${slave_newsd_tur_stop_postcommand}"}



: ${clickdaemon_enable="YES"}
: ${clickdaemon_user="websearch"}
: ${clickdaemon_port="18100"}
: ${clickdaemon_chdir="/hol/clickdaemon"}
: ${clickdaemon_program="${clickdaemon_chdir}/bin/clickdaemon"}
: ${clickdaemon_flags="-p ${clickdaemon_port} -n 600 -q 600 -c 5000 -K ${clickdaemon_chdir}/data/clickdaemon.keys -u new"}
: ${clickdaemon_pid_file="${clickdaemon_chdir}/pids/${name}.pid"}
: ${clickdaemon_pid_file_loop="${clickdaemon_chdir}/pids/${name}-loop.pid"}
: ${clickdaemon_err_log="${clickdaemon_chdir}/logs/${name}.out"}
: ${clickdaemon_out_log="${clickdaemon_chdir}/logs/${name}.err"}
: ${clickdaemon_loop_log="${clickdaemon_chdir}/logs/${name}-loop.log"}
: ${clickdaemon_check_group="+MISC_CLICK_DAEMON"}
: ${clickdaemon_start_postcommand="while ! nc -z localhost ${clickdaemon_port}; do sleep 2; done"}
: ${clickdaemon_stop_command="fetch -q -o - http://localhost:${clickdaemon_port}/admin?action=shutdown"}
: ${clickdaemon_reload_command="${clickdaemon_stop_command}"}
: ${clickdaemon_reload_postcommand="${clickdaemon_start_postcommand}"}


: ${mtd_enable="YES"}
: ${mtd_user="websearch"}
: ${mtd_port="19016"}
: ${mtd_chdir="/place/mt"}
: ${mtd_program="${mtd_chdir}/bin/mtd"}
: ${mtd_flags="-c ${mtd_chdir}/conf/server.cfg -p ${mtd_port}"}
: ${mtd_pid_file="${mtd_chdir}/pids/${name}.pid"}
: ${mtd_pid_file_loop="${mtd_chdir}/pids/${name}-loop.pid"}
: ${mtd_err_log="${mtd_chdir}/log/${name}.out"}
: ${mtd_out_log="${mtd_chdir}/log/${name}.err"}
: ${mtd_loop_log="${mtd_chdir}/log/${name}-loop.log"}
: ${mtd_start_postcommand="while ! nc -z localhost ${mtd_port}; do sleep 2; done"}
: ${mtd_stop_command="echo 'CTL STOP HTTP/1.0 ' | nc localhost ${mtd_port} > /dev/null"}
: ${mtd_reload_command="${mtd_stop_command}"}
: ${mtd_reload_postcommand="${mtd_start_postcommand}"}
: ${mtd_reopenlog_command="echo 'CTL RELOAD HTTP/1.0 ' | nc localhost ${mtd_port} > /dev/null"}


: ${ams_balancer_enable="YES"}
: ${ams_balancer_user="websearch"}
: ${ams_balancer_port="8180"}
: ${ams_balancer_chdir="/hol/arkanavt/${name}"}
: ${ams_balancer_program="${ams_balancer_chdir}/${name}"}
: ${ams_balancer_flags="${ams_balancer_chdir}/${name}.cfg"}
: ${ams_balancer_pid_file="${ams_balancer_chdir}/pids/${name}.pid"}
: ${ams_balancer_pid_file_loop="${ams_balancer_chdir}/pids/${name}-loop.pid"}
: ${ams_balancer_out_log="${ams_balancer_chdir}/logs/${name}.out"}
: ${ams_balancer_err_log="${ams_balancer_chdir}/logs/${name}.err"}
: ${ams_balancer_loop_log="${ams_balancer_chdir}/logs/${name}-loop.log"}
: ${ams_balancer_limits_args="-e -B -C yandex"}
: ${ams_balancer_stop_precommand="ipfw -q add 203 reset tcp from 10.0.0.1 to me ${ams_balancer_port} setup && sleep 10"}
: ${ams_balancer_stop_postcommand="ipfw -q delete 203"}
: ${ams_balancer_reload_precommand="${ams_balancer_stop_precommand}"}
: ${ams_balancer_reload_postcommand="while ! nc -z localhost ${ams_balancer_port}; do sleep 2; done && ${ams_balancer_stop_postcommand}"}


: ${ams_hamster_balancer_enable="YES"}
: ${ams_hamster_balancer_user="websearch"}
: ${ams_hamster_balancer_port="18300"}
: ${ams_hamster_balancer_chdir="/hol/arkanavt/${name}"}
: ${ams_hamster_balancer_program="${ams_hamster_balancer_chdir}/${name}"}
: ${ams_hamster_balancer_flags="${ams_hamster_balancer_chdir}/${name}.cfg"}
: ${ams_hamster_balancer_pid_file="${ams_hamster_balancer_chdir}/pids/${name}.pid"}
: ${ams_hamster_balancer_pid_file_loop="${ams_hamster_balancer_chdir}/pids/${name}-loop.pid"}
: ${ams_hamster_balancer_out_log="${ams_hamster_balancer_chdir}/logs/${name}.out"}
: ${ams_hamster_balancer_err_log="${ams_hamster_balancer_chdir}/logs/${name}.err"}
: ${ams_hamster_balancer_loop_log="${ams_hamster_balancer_chdir}/logs/${name}-loop.log"}
: ${ams_hamster_balancer_limits_args="-e -B -C yandex"}
: ${ams_hamster_balancer_stop_precommand="ipfw -q add 204 reset tcp from 10.0.0.1 to me ${ams_hamster_balancer_port} setup && sleep 10"}
: ${ams_hamster_balancer_stop_postcommand="ipfw -q delete 204"}
: ${ams_hamster_balancer_reload_precommand="${ams_hamster_balancer_stop_precommand}"}
: ${ams_hamster_balancer_reload_postcommand="while ! nc -z localhost ${ams_hamster_balancer_port}; do sleep 2; done && ${ams_hamster_balancer_stop_postcommand}"}



: ${yandex_com_balancer_enable="YES"}
: ${yandex_com_balancer_user="websearch"}
: ${yandex_com_balancer_port="8380"}
: ${yandex_com_balancer_chdir="/hol/arkanavt/${name}"}
: ${yandex_com_balancer_program="${yandex_com_balancer_chdir}/${name}"}
: ${yandex_com_balancer_flags="${yandex_com_balancer_chdir}/${name}.cfg"}
: ${yandex_com_balancer_pid_file="${yandex_com_balancer_chdir}/pids/${name}.pid"}
: ${yandex_com_balancer_pid_file_loop="${yandex_com_balancer_chdir}/pids/${name}-loop.pid"}
: ${yandex_com_balancer_out_log="${yandex_com_balancer_chdir}/logs/${name}.out"}
: ${yandex_com_balancer_err_log="${yandex_com_balancer_chdir}/logs/${name}.err"}
: ${yandex_com_balancer_loop_log="${yandex_com_balancer_chdir}/logs/${name}-loop.log"}
: ${yandex_com_balancer_limits_args="-e -B -C yandex"}
: ${yandex_com_balancer_stop_precommand="ipfw -q add 205 reset tcp from 10.0.0.1 to me ${yandex_com_balancer_port} setup && sleep 10"}
: ${yandex_com_balancer_stop_postcommand="ipfw -q delete 205"}
: ${yandex_com_balancer_reload_precommand="${yandex_com_balancer_stop_precommand}"}
: ${yandex_com_balancer_reload_postcommand="while ! nc -z localhost ${yandex_com_balancer_port}; do sleep 2; done && ${yandex_com_balancer_stop_postcommand}"}

: ${market_balancer_enable="YES"}
: ${market_balancer_user="websearch"}
: ${market_balancer_port="8380"}
: ${market_balancer_chdir="/hol/arkanavt/${name}"}
: ${market_balancer_program="${market_balancer_chdir}/${name}"}
: ${market_balancer_flags="${market_balancer_chdir}/${name}.cfg"}
: ${market_balancer_pid_file="${market_balancer_chdir}/pids/${name}.pid"}
: ${market_balancer_pid_file_loop="${market_balancer_chdir}/pids/${name}-loop.pid"}
: ${market_balancer_out_log="${market_balancer_chdir}/logs/${name}.out"}
: ${market_balancer_err_log="${market_balancer_chdir}/logs/${name}.err"}
: ${market_balancer_loop_log="${market_balancer_chdir}/logs/${name}-loop.log"}
: ${market_balancer_limits_args="-e -B -C yandex"}
: ${market_balancer_stop_precommand="ipfw -q add 207 reset tcp from 10.0.0.1 to me ${market_balancer_port} setup && sleep 10"}
: ${market_balancer_stop_postcommand="ipfw -q delete 207"}
: ${market_balancer_reload_precommand="${market_balancer_stop_precommand}"}
: ${market_balancer_reload_postcommand="while ! nc -z localhost ${market_balancer_port}; do sleep 2; done && ${market_balancer_stop_postcommand}"}

: ${yandexcomtr_balancer_enable="YES"}
: ${yandexcomtr_balancer_user="websearch"}
: ${yandexcomtr_balancer_port="8480"}
: ${yandexcomtr_balancer_chdir="/hol/arkanavt/${name}"}
: ${yandexcomtr_balancer_program="${yandexcomtr_balancer_chdir}/${name}"}
: ${yandexcomtr_balancer_flags="${yandexcomtr_balancer_chdir}/${name}.cfg"}
: ${yandexcomtr_balancer_pid_file="${yandexcomtr_balancer_chdir}/pids/${name}.pid"}
: ${yandexcomtr_balancer_pid_file_loop="${yandexcomtr_balancer_chdir}/pids/${name}-loop.pid"}
: ${yandexcomtr_balancer_out_log="${yandexcomtr_balancer_chdir}/logs/${name}.out"}
: ${yandexcomtr_balancer_err_log="${yandexcomtr_balancer_chdir}/logs/${name}.err"}
: ${yandexcomtr_balancer_loop_log="${yandexcomtr_balancer_chdir}/logs/${name}-loop.log"}
: ${yandexcomtr_balancer_limits_args="-e -B -C yandex"}
: ${yandexcomtr_balancer_stop_precommand="ipfw -q add 209 reset tcp from 10.0.0.1 to me ${yandexcomtr_balancer_port} setup && sleep 10"}
: ${yandexcomtr_balancer_stop_postcommand="ipfw -q delete 209"}
: ${yandexcomtr_balancer_reload_precommand="${yandexcomtr_balancer_stop_precommand}"}
: ${yandexcomtr_balancer_reload_postcommand="while ! nc -z localhost ${yandexcomtr_balancer_port}; do sleep 2; done && ${yandexcomtr_balancer_stop_postcommand}"}


start_cmd="start_cmd"
loop_cmd="loop_cmd"
stop_cmd="stop_cmd"
reload_cmd="reload_cmd"

# Required variables
eval program="\$${name}_program"
eval pid_file="\$${name}_pid_file"
eval pid_file_loop="\$${name}_pid_file_loop"
for var in program pid_file pid_file_loop; do
	eval _var="\$${var}"
	if [ -z "${_var}" ]; then
		echo 1>&2 "${name}_${var} is not set."
		exit 1
	fi
done

# Optional variables
eval user="\$${name}_user"
eval port="\$${name}_port"
eval chdir="\$${name}_chdir"
eval rc_flags="\$${name}_flags"
eval out_log="\$${name}_out_log"
eval err_log="\$${name}_err_log"
eval loop_log="\$${name}_loop_log"
eval check_group="\$${name}_check_group"
if [ -n "${check_group}" ]; then
	if ! /Berkanavt/bin/scripts/yr ${check_group} LIST 2> /dev/null | /usr/bin/grep -qx "${hostname%.yandex.ru}"; then
		eval ${name}_enable="NO"
	fi
fi
eval limits_args="\$${name}_limits_args"
eval timeout="\$${name}_timeout"
eval timeout_signal="\$${name}_timeout_signal"
eval start_postcommand="\$${name}_start_postcommand"
eval stop_precommand="\$${name}_stop_precommand"
eval stop_command="\$${name}_stop_command"
eval stop_postcommand="\$${name}_stop_postcommand"
eval reload_precommand="\$${name}_reload_precommand"
eval reload_command="\$${name}_reload_command"
eval reload_postcommand="\$${name}_reload_postcommand"
eval reopenlog_command="\$${name}_reopenlog_command"
if [ -n "${reopenlog_command}" ]; then
	extra_commands="reopenlog"
	reopenlog_cmd="reopenlog_cmd"
fi

: ${loop_log:="/dev/null"}
: ${timeout:="60"}
: ${timeout_signal:="-TERM"}
: ${kill_signal:="-KILL"}

command="${program}"
command_args="${rc_flags}"
required_files="${command}"

kill_after_timeout()
{
	local _sleep _count _pid _prefix

	if [ $# -lt 2 -o -z "$1" -o -z "$2" ]; then
		return 1
	fi

	_sleep=2
	_count=$(($1 / ${_sleep}))
	_pid="$2"
	_prefix=""
	while :; do
		if ! kill -0 ${_pid} 2> /dev/null; then
			break
		fi
		if [ ${_count} -eq 0 ]; then
			kill ${timeout_signal} ${_pid}
			echo -n " (sending signal ${timeout_signal})"
		elif [ ${_count} -lt 0 ]; then
			echo " (cannot kill)."
			return 1
		fi
		echo -n ${_prefix:-"Waiting for PID: "}${_pid}
		_prefix=", "
		sleep ${_sleep}
		_count=$((${_count} - 1))
	done
	if [ -n "${_prefix}" ]; then
		echo "."
	fi

	return 0
}

start_cmd()
{
	local _pid_loop _pid _daemon_cmd _id

	_pid_loop=$(check_pidfile ${pid_file_loop} "/bin/sh")
	if [ -n "${_pid_loop}" ]; then
		echo 1>&2 "${name_loop} already running? (pid=${_pid_loop})."
		exit 1
	fi

	_pid=$(check_pidfile ${pid_file} ${command})
	if [ -n "${_pid}" ]; then
		echo 1>&2 "${name} already running? (pid=${_pid})."
		exit 1
	fi

	# Apply limits if define (some limits may fail if you are not root)
	if [ -n "${limits_args}" ]; then
		eval `/usr/bin/limits ${limits_args}` 2> /dev/null
	fi

	_daemon_cmd="/usr/sbin/daemon -f -p ${pid_file_loop}"

	if [ -z "${chdir}" ]; then
		_daemon_cmd="${_daemon_cmd} -c"
	fi

	_id=$(eval $IDCMD)
	if [ -z "${user}" -o "${_id}" = "${user}" ]; then
		:
	elif [ "${_id}" = "root" ]; then
		_daemon_cmd="${_daemon_cmd} -u ${user}"
	else
		echo 1>&2 "You must be root or ${user}."
		exit 1
	fi

	echo "Starting ${name}."
	if ! eval ${chdir:+"cd ${chdir} &&"} \
	    ${_daemon_cmd} ${startup_script} ${_rc_prefix}loop ${rc_extra_args}; then
		echo 1>&2 "Starting ${name} failed."
		exit 1
	fi

	# Execute $start_postcommand only if script is started by user
	if [ -z "${rc_fast}" -a -n "${start_postcommand}" ]; then
		eval ${start_postcommand}
	fi
}

loop_cmd()
{
	local _pid _rc _cmd

	while :; do
		_cmd="${command} ${command_args} ${out_log:+">> ${out_log}"} ${err_log:+"2>> ${err_log}"} &"
		echo "${_cmd}" >> ${loop_log}
		eval ${_cmd}
		_pid="$!"
		echo -n "${_pid}" > ${pid_file}
		echo "$(date '+%s %Y-%m-%d %H:%M:%S') pid: ${_pid}" >> ${loop_log}
		wait ${_pid}
		_rc="$?"
		echo "$(date '+%s %Y-%m-%d %H:%M:%S') exit code: ${_rc}" >> ${loop_log}
		rm -f ${pid_file}
		sleep 2
	done
}

stop_cmd()
{
	local _pid_loop _pid _force

	# Kill loop script if it is running ($command may not be runnig)
	_pid_loop=$(check_pidfile ${pid_file_loop} "/bin/sh")
	if [ -n "${_pid_loop}" ]; then
		kill -TERM ${_pid_loop}
		rm -f ${pid_file_loop}
	else
		echo 1>&2 "${name_loop} is not running."
		exit 1
	fi

	_force=1
	_pid=$(check_pidfile ${pid_file} ${command})
	if [ -n "${_pid}" ]; then
		echo "Stopping ${name}."
		# Execute $stop_precommand if it defined
		if [ -n "${stop_precommand}" ]; then
			eval ${stop_precommand}
		fi

		if [ -n "${stop_command}" ]; then
			if eval ${stop_command}; then
				_force=0
			fi
		fi

		# Kill $command if $stop_command did not define or failed
		if [ "${_force}" -eq 1 ]; then
			echo "Force stopping ${name}."
			kill -TERM ${_pid}
		fi
		if ! kill_after_timeout ${timeout} ${_pid}; then
			echo "Force stopping ${name} (sending signal ${kill_signal})."
			kill ${kill_signal} ${_pid}
		fi
		rm -f ${pid_file}

		# Execute $stop_postcommand if it defined
		if [ -n "${stop_postcommand}" ]; then
			eval ${stop_postcommand}
		fi
	else
		echo 1>&2 "${name} is not running."
		exit 1
	fi
}

reload_cmd()
{
	local _pid _force

	_force=1
	_pid=$(check_pidfile ${pid_file} ${command})
	if [ -n "${_pid}" ]; then
		echo "Reloading ${name}."
		# Execute $reload_precommand if it defined
		if [ -n "${reload_precommand}" ]; then
			eval ${reload_precommand}
		fi

		if [ -n "${reload_command}" ]; then
			if eval ${reload_command}; then
				_force=0
			fi
		fi

		# Kill $command if $reload_command did not define or failed
		if [ "${_force}" -eq 1 ]; then
			echo "Force reloading ${name}."
			kill -TERM ${_pid}
		fi
		if ! kill_after_timeout ${timeout} ${_pid}; then
			echo "Force reloading ${name} (sending signal ${kill_signal})."
			kill ${kill_signal} ${_pid}
		fi

		# Execute $reload_postcommand if it defined
		if [ -n "${reload_postcommand}" ]; then
			eval ${reload_postcommand}
		fi
	else
		echo 1>&2 "${name} is not running."
		exit 1
	fi
}

reopenlog_cmd()
{
	local _pid

	_pid=$(check_pidfile ${pid_file} ${command})
	if [ -n "${_pid}" ]; then
		echo "Reopening log ${name}."
		if ! eval ${reopenlog_command}; then
			echo 1>&2 "Reopening log ${name} failed."
			exit 1
		fi
	else
		echo 1>&2 "${name} is not running."
		exit 1
	fi
}

extra_commands="loop reload ${extra_commands}"
run_rc_command "$1"
