# Check if process ID is valid function checkpid() { if [ -f "$1" ]; then out=$(cat "$1") if [ -z "$(ps -ef | awk -v pid="$out" '{if ($2 == pid) {print $2}}')" ]; then exit 1 fi else exit 1 fi echo "$out" } # Kill a service function kill_service() { if [ "$1" -ne 0 ]; then echo "$2 not running" else kill "$4" "$3" > /dev/null 2>&1 fi } # Remove Apache built-in modules function removeapachebuildinmodules() { "$2" -l | grep -v "Compiled in modules" | sed "s|\.c$|.so|g" | while read -r line; do sed -i "/^LoadModule.*\/${line}$/d" "$1" done } # Get PandaBot configuration from YAML function getpandabotconf() { out=$(echo "$1@@$2" | php -R ' $in=explode("@@", $argn); $config = yaml_parse_file($in[0]); if (array_key_exists($in[1], $config)) { echo $config[$in[1]]; } else { exit(1); } ') if [ $? -ne 0 ]; then exit 1 fi echo "$out" } # Get the path of the HTTP daemon (httpd or apache2) function httpdbin() { out=$(which httpd 2> /dev/null) if [ $? -ne 0 ]; then out=$(which apache2 2> /dev/null) if [ $? -ne 0 ]; then exit 1 fi fi echo "$out" } # Find PHP-FPM binary function phpfpmbin() { out=$(find /usr/sbin/ -name php-fpm* 2> /dev/null | head -1) if [ -z "$out" ]; then exit 1 fi echo "$out" } # Find Apache mod_mpm_event.so path function apachemod() { out=$(find /usr -name "mod_mpm_event.so" 2> /dev/null | awk -F / '{for (i=1;i "${apache_serverroot}/conf/php-fpm.conf" "$php_fpm_bin" -y "${apache_serverroot}/conf/php-fpm.conf" 2> /dev/null if [ $? -ne 0 ]; then echo "php-fpm already running" out=$(checkpid "$fpm_pid") kill "$out" > /dev/null 2>&1 "$php_fpm_bin" -y "${apache_serverroot}/conf/php-fpm.conf" 2> /dev/null echo "php-fpm restarted" else echo "php-fpm started" fi } # Start Apache service function start_apache() { prepare_web apachebin=$(httpdbin) if [ $? -ne 0 ]; then echo "ERR: apache installation not found" exit 1 fi apache_modules=$(apachemod) if [ $? -ne 0 ]; then echo "ERR: no apache modules path found" exit 1 fi rm -rf "${apache_serverroot}/log/access_log" > /dev/null 2>&1 # clear access_log file... apache_pid="${apache_serverroot}/log/tmp/httpd.pid" apache_documentroot="${apache_serverroot}/pb-web" cat "${apache_serverroot}/conf/templates/template.httpd.conf" | \ sed "s|@@apache_modules@@|$apache_modules|g" \ | sed "s|@@apache_serverroot@@|$apache_serverroot|g" \ | sed "s|@@apache_user@@|$apache_user|g" \ | sed "s|@@apache_group@@|$apache_group|g" \ | sed "s|@@apache_port@@|$apache_port|g" \ | sed "s|@@apache_documentroot@@|$apache_documentroot|g" \ | sed "s|@@apache_pid@@|$apache_pid|g" \ > "${apache_serverroot}/conf/httpd.conf" removeapachebuildinmodules "${apache_serverroot}/conf/httpd.conf" "$apachebin" chmod -R a+rwx "$apache_documentroot" 2>&1 /dev/null chmod -R a+rwx "${apache_serverroot}/log" 2>&1 /dev/null "$apachebin" -f "${apache_serverroot}/conf/httpd.conf" -k restart > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Apache (re)started @ port: $apache_port" else echo "ERR: Apache not started, something is wrong..." fi } # Start the bot function start_bot() { out=$(checkpid "$bot_pid") if [ -n "$out" ]; then echo "Bot already running, exit!" exit 1 fi cp conf/channels.conf "log/conf/${startDate}_channels.conf" cp conf/pandabot.conf "log/conf/${startDate}_pandabot.conf" # Clean up old log files ls -r1 log/*_pandabot.app.log | awk 'NR >= 10' | xargs -n1 rm -f ls -r1 log/conf/*pandabot.conf | awk 'NR >= 10' | xargs -n1 rm -f ls -r1 log/conf/*channels.conf | awk 'NR >= 10' | xargs -n1 rm -f if [ "$(id -u)" -eq 0 ]; then chown -R nobody * su nobody -c "nohup bin/pandabot.php 2>&1 | tee log.pandabot.log 2>&1 | tee log/${startDate}_pandabot.app.log > /dev/null &" if [ $? -ne 0 ]; then echo "Change user nobody from nologin to bash" usermod -s /usr/bin/bash nobody su nobody -c "nohup bin/pandabot.php 2>&1 | tee log.pandabot.log 2>&1 | tee log/${startDate}_pandabot.app.log > /dev/null &" if [ $? -ne 0 ]; then echo "ERR: Change user nobody manually from /sbin/nologin to /bin/bash @ /etc/passwd, or start bot in user context" exit 1 fi fi else nohup bin/pandabot.php 2>&1 | tee log.pandabot.log 2>&1 | tee log/${startDate}_pandabot.app.log > /dev/null & fi } # Start a specific service function start_service() { echo "Start $1" case "$1" in "bot") start_bot ;; "apache") start_apache sleep 2 status_service "apache" ;; "fpm") start_fpm ;; "web") start_service "apache" start_service "fpm" ;; "all") start_service "bot" start_service "web" ;; esac } # Stop a specific service function stop_service() { echo "Stop $1" case "$1" in "bot") out=$(checkpid "$bot_pid") kill_service "$?" "$1" "$out" "-9" ;; "apache") out=$(checkpid "$apache_pid") kill_service "$?" "$1" "$out" "" ;; "fpm") out=$(checkpid "$fpm_pid") kill_service "$?" "$1" "$out" "" ;; "madeline") kill_service "0" "$1" "$madeline_pid" "-9" ;; "web") stop_service "apache" stop_service "fpm" ;; "all") stop_service "web" stop_service "bot" stop_service "madeline" ;; esac } # Get the status of a service function status_service() { case "$1" in "bot") out=$(checkpid "$bot_pid") if [ $? -eq 0 ]; then echo "$1 running" else echo "$1 not running" fi ;; "apache") out=$(checkpid "$apache_pid") if [ $? -eq 0 ]; then apache_ip_running=$(ip -br address | grep -iwv lo | awk '{print $3}' | awk -F / '{print $1}') apache_port=$(getpandabotconf "$pandabotconf" "apache_port") echo "$1 running on: http://$apache_ip_running:$apache_port/" else echo "$1 not running" fi ;; "fpm") out=$(checkpid "$fpm_pid") if [ $? -eq 0 ]; then echo "$1 running" else echo "$1 not running" fi ;; "madeline") if [ $? -eq 0 ]; then echo "$1 running" else echo "$1 not running" fi ;; "web") echo "Status $1" status_service "apache" status_service "fpm" ;; "all") echo "Status $1" status_service "web" status_service "bot" status_service "madeline" ;; esac } # Bot script usage guide function bot_sh_usage() { echo "Usage: ./bot.sh start ./bot.sh stop ./bot.sh restart ./bot.sh status - ./bot.sh setuptg ./bot.sh start -s [bot|web] ./bot.sh stop -s [bot|web] ./bot.sh restart -s [bot|web] ./bot.sh status -s [bot|web] Example: ./bot.sh restart -s bot ./bot.sh restart -s web " }