From 3d5410fbc4af864c5ae0b9a32ef84758a4b33334 Mon Sep 17 00:00:00 2001 From: "h@x" <3-hx@users.noreply.git.n64.cc> Date: Sun, 15 Dec 2024 23:45:12 +0000 Subject: [PATCH] A lot if improvements --- README.md | 3 +- bin/setuptg.php | 2 +- bot.sh | 127 ++++++- conf/channels.conf | 10 +- inc/sh/inc.bot.sh | 487 +++++++++++++++----------- pb-web/index.html | 2 +- pb-web/js/pandabot.js | 18 +- prepare_centos9.sh | 32 -- prepare_server/Prepare_RHEL-Debian.sh | 94 +++++ 9 files changed, 520 insertions(+), 255 deletions(-) delete mode 100755 prepare_centos9.sh create mode 100644 prepare_server/Prepare_RHEL-Debian.sh diff --git a/README.md b/README.md index 058f379..208b1be 100644 --- a/README.md +++ b/README.md @@ -1,2 +1 @@ -# Pandabot - +# Pandabot \ No newline at end of file diff --git a/bin/setuptg.php b/bin/setuptg.php index b4b482c..503d1b1 100755 --- a/bin/setuptg.php +++ b/bin/setuptg.php @@ -5,6 +5,6 @@ date_default_timezone_set('Europe/Berlin'); $date=gmdate("Y-m-d H:i:s", time()+date("Z")); - $sendMsg="madeline as client registered : ".$date."
"; + $sendMsg="Madeline as client has been registered : ".$date."
"; $out=made("messages", "sendMessage", array("peer" => $globalsettings["bot"]["pandaownerid"], "message" => $sendMsg, "parse_mode" => "html")); // print_r($out); \ No newline at end of file diff --git a/bot.sh b/bot.sh index 0dac404..9947f98 100755 --- a/bot.sh +++ b/bot.sh @@ -1,4 +1,129 @@ -#!/bin/bash +#!/bin#!/bin/bash + +# Get the current timestamp for logging or unique identifier +startDate=$(date "+%Y%m%d%H%M%S") + +# Log file for all actions +log_file="/var/log/pandabot.log" + +# Function to log messages to both console and log file with timestamp +log_message() { + local message=$1 + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + + # Log to console + echo "$timestamp - $message" + + # Log to file + echo "$timestamp - $message" >> "$log_file" +} + +# Source external bot configuration and utility functions +. inc/sh/inc.bot.sh + +# Define various bot service paths and session files +bot_root=$(pwd) +bot_pid="${bot_root}/log/tmp/pandabot.pid" +madeline_session="${bot_root}/session.madeline" +madeline_pid=$(ps -ef | grep "${madeline_session}" | grep -v grep | awk '{print $2}') +apache_pid="${bot_root}/log/tmp/httpd.pid" +fpm_pid="${bot_root}/log/tmp/php-fpm.pid" + +# Configuration file for bot and services +pandabotconf="${bot_root}/conf/pandabot.conf" +services="bot|web|apache|fpm|madeline|" + +# Check if pandabot.conf exists before attempting to read +if [ ! -f "$pandabotconf" ]; then + log_message "ERROR: pandabot.conf not found at $pandabotconf" + exit 2 +fi + +# Get the wait timer from the configuration file +waittimer=$(getpandabotconf "${pandabotconf}" "botsh_restart_wait_timer") +if [ $? -ne 0 ]; then + log_message "ERROR: botsh_restart_wait_timer not configured @ ${pandabotconf}" + exit 2 +fi + +# Check if madeline session file exists before trying to use it +if [ ! -f "$madeline_session" ]; then + log_message "ERROR: Madeline session file not found at $madeline_session" + exit 2 +fi + +# Ensure that at least one argument is provided +if [ $# -eq 0 ]; then + bot_sh_usage + exit 1 +fi + +# Process command line arguments and options +OPTIND=2 +while getopts "s:" arg; do + case "${arg}" in + s) service=${OPTARG} ;; # Set the service if -s option is used + esac +done + +# Check if the specified service is valid +if [ ! -z "${service}" ]; then + out=$(checkservice "${service}" "${services}") + if [ $? -ne 0 ]; then + log_message "ERROR: Service '${service}' not found in the list: ${services}" + bot_sh_usage + exit 4 + fi +else + service="all" # Default to all services if no specific service is given +fi + +# Main logic for managing services based on the command +case "$1" in + "start") + start_service "${service}" + log_message "Started service: ${service}" + ;; + + "stop") + stop_service "${service}" + log_message "Stopped service: ${service}" + ;; + + "restart") + stop_service "${service}" + log_message "Stopped service: ${service}" + echo "Wait ${waittimer} seconds" + + # Validate waittimer (ensure it's a positive integer) + if ! [[ "${waittimer}" =~ ^[0-9]+$ ]] || [ "${waittimer}" -le 0 ]; then + log_message "ERROR: Invalid waittimer value in ${pandabotconf}. Must be a positive integer." + exit 3 + fi + sleep "${waittimer}" + start_service "${service}" + log_message "Restarted service: ${service}" + ;; + + "setuptg") + echo "Setting up TG for service: ${service}" + log_message "Setting up TG for service: ${service}" + bin/setuptg.php + ;; + + "status") + status_service "${service}" + log_message "Checked status of service: ${service}" + ;; + + *) + # Default case: show usage if no valid argument is given + bot_sh_usage + log_message "ERROR: Invalid argument provided" + ;; +esac + +/bash startDate=`date "+%Y%m%d%H%M%S"`; . inc/sh/inc.bot.sh diff --git a/conf/channels.conf b/conf/channels.conf index 2e047fb..3ed7d43 100755 --- a/conf/channels.conf +++ b/conf/channels.conf @@ -1,8 +1,8 @@ -# attention: bot rewrite hes own conf file in human readable form -# all "to:" channels automatical r mode and will be readed -# all channels without "to:" will be still readed and saved in database -# from and section names must be unique, otherwise, the last find will be used -# example section config: +# Attention: bot rewrite hes own conf file in human readable form +# All "to:" channels automatical r mode and will be read. +# All channels without "to:" will be still read and saved in the database +# From and section names must be unique, otherwise, the last find will be used +# Example section config: # ----------------------- # # '': diff --git a/inc/sh/inc.bot.sh b/inc/sh/inc.bot.sh index b51169b..36d0596 100755 --- a/inc/sh/inc.bot.sh +++ b/inc/sh/inc.bot.sh @@ -1,263 +1,342 @@ +# Check if process ID is valid function checkpid() { - if [ -f ${1} ]; then - out=`cat ${1}` - [ -z "`ps -ef | awk -v pid=${out} '{if ($2 == pid) {print $2}}'`" ] && exit 1 - else - exit 1 - fi - echo "${out}" + 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 + 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 + "$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); if (array_key_exists($in[1], yaml_parse_file($in[0]))) { echo yaml_parse_file($in[0])[$in[1]];} else exit(1);'` - [ $? -ne 0 ] && exit 1 - echo "${out}" + 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}" + 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` - [ -z "${out}" ] && exit 1 - echo "${out}" + 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 /dev/null | awk -F / '{for (i=1;i ${apache_serverroot}/conf/php-fpm.conf + cat "${apache_serverroot}/conf/templates/template.php-fpm.conf" | \ + 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" \ + > "${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 # if [ $? -ne 0 ]; then + "$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` - [ $? -ne 0 ] && echo "ERR: apache installation not found" && exit 1 + prepare_web + apachebin=$(httpdbin) + + if [ $? -ne 0 ]; then + echo "ERR: apache installation not found" + exit 1 + fi - apache_modules=`apachemod` - [ $? -ne 0 ] && echo "ERR: no apache modules pfad found" && exit 1 + 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... + 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" + 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 + 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}" + 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 # if [ $? -eq 0 ]; then -} + 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}"` - [ ! -z "${out}" ] && echo "bot already running, exit!" && exit 1 + 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 + cp conf/channels.conf "log/conf/${startDate}_channels.conf" + cp conf/pandabot.conf "log/conf/${startDate}_pandabot.conf" - ls -r1 log/*_pandabot.app.log | awk 'begin {c=0;} {c++; if (c>=10) {print $0}}' | xargs -n1 rm -f # logrotation? function? - ls -r1 log/conf/*pandabot.conf | awk 'begin {c=0;} {c++; if (c>=10) {print $0}}' | xargs -n1 rm -f - ls -r1 log/conf/*channels.conf | awk 'begin {c=0;} {c++; if (c>=10) {print $0}}' | xargs -n1 rm -f + # 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 &" - [ $? -ne 0 ] && "ERR: change user nobody manually from /sbin/nologin to /bin/bash @ /etc/passwd, or start bot in usercontext" && exit 1 - fi # if [ $? -ne 0 ]; then - else - nohup bin/pandabot.php 2>&1 | tee log.pandabot.log 2>&1 | tee log/${startDate}_pandabot.app.log > /dev/null & - fi # if [ `id -u` -eq 0 ]; then + 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 "${1}" - ;; - "fpm") - start_fpm - ;; - "web") - start_service "apache" - start_service "fpm" - ;; - "all") - start_service "bot" - start_service "web" - ;; - esac + 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 + 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 } -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") ## grummel - 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 +# 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: + echo "Usage: ./bot.sh start ./bot.sh stop ./bot.sh restart @@ -269,7 +348,7 @@ echo "usage: ./bot.sh stop -s [bot|web] ./bot.sh restart -s [bot|web] ./bot.sh status -s [bot|web] -eg. +Example: ./bot.sh restart -s bot ./bot.sh restart -s web " diff --git a/pb-web/index.html b/pb-web/index.html index 81e67ff..cafbddc 100755 --- a/pb-web/index.html +++ b/pb-web/index.html @@ -2,7 +2,7 @@ - pandabot + Pandabot diff --git a/pb-web/js/pandabot.js b/pb-web/js/pandabot.js index 2a4eb80..200c18e 100755 --- a/pb-web/js/pandabot.js +++ b/pb-web/js/pandabot.js @@ -1,5 +1,5 @@ - setInterval(readLogFile, 4000); + setInterval(readLogFile, 4000); setInterval(stats, 15000); setInterval(queuestats, 2000); window.onload = start; @@ -20,7 +20,7 @@ function gettitle() { function start() { gettitle(); - $(".fulllogbuttonhide" ).hide(); + $(".fulllogbuttonhide" ).hide(); $(".fulllog" ).hide(); $(".editout" ).hide(); $(".botcmdout" ).hide(); @@ -131,12 +131,12 @@ function sortchannels(option, cmd) { // hmmm }); $(function(){ - $("#floghide").click(function() { + $("#floghide").click(function() { $( ".fulllogbutton" ).show(); $( "#botcmdid" ).show(); $( ".fulllogbuttonhide" ).hide(); $( ".fulllog" ).empty(); - $( ".viewcontainer" ).show(); + $( ".viewcontainer" ).show(); $( ".viewborder" ).show(); $( ".fulllog" ).hide(); $(".confmain").show(); @@ -213,12 +213,12 @@ function botcmd(option, cmd) { function botcmdokay() { if ($(".mainfade").css("opacity") == 1) { - $(".mainfade").fadeTo(1000, 0.05); - $( ".botcmdout" ).fadeTo(500, 1); + $(".mainfade").fadeTo(1000, 0.05); + $( ".botcmdout" ).fadeTo(500, 1); } if ($(".mainfade").css("opacity") == 0.05) { - $(".mainfade").fadeTo(1000, 1); - $( ".botcmdout" ).hide(); + $(".mainfade").fadeTo(1000, 1); + $( ".botcmdout" ).hide(); } $("#botcmdid").attr('disabled', false); $("#flog").attr('disabled', false); @@ -231,7 +231,7 @@ function botcmdokay() { }); $(function(){ - $("#editokaybutton").click(function() { + $("#editokaybutton").click(function() { editdone(); }); }); diff --git a/prepare_centos9.sh b/prepare_centos9.sh deleted file mode 100755 index c17ef66..0000000 --- a/prepare_centos9.sh +++ /dev/null @@ -1,32 +0,0 @@ -[ `id -u` -ne 0 ] && echo "ERR: must be run as: root" && exit 1 -[ ! -f /etc/centos-release ] && echo "ERR: works only on centos" && exit 1 - -dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y -dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y -dnf module install php:remi-8.3 -y - -yum install net-tools postgresql postgresql-server httpd php-fpm -y -yum install php-pecl-yaml php-pgsql php-pdo -y - -/usr/bin/postgresql-setup --initdb -cd /var/lib/pgsql/data -cat pg_hba.conf | sed 's|host all all 127.0.0.1/32 ident|host all all 0.0.0.0/0 trust|g' > pg_hba.conf1 -cp pg_hba.conf1 pg_hba.conf -rm -rf pg_hba.conf1 - -systemctl restart postgresql - -su - postgres -c 'echo "CREATE DATABASE pandabot;" | psql' - -printf "\n------------------------- --- -- - -\n" -echo "edit conf/pandabot.conf && conf/channels.conf" -echo "dbname: pandabot" -echo "dbhost: `ip -br address | grep -iwv lo | awk '{print $3}' | awk -F / '{print $1}'`" -echo "dbport: 5432" -echo "dbuser: postgres" -echo "dbpass: false" -printf "\n" -echo "setup tg session with ./bot.sh setuptg" -echo "start bot with ./bot.sh start" -echo "stop bot with ./bot.sh stop" -echo "------------------------- --- -- - -" diff --git a/prepare_server/Prepare_RHEL-Debian.sh b/prepare_server/Prepare_RHEL-Debian.sh new file mode 100644 index 0000000..64e585f --- /dev/null +++ b/prepare_server/Prepare_RHEL-Debian.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Ensure the script is run as root +[ "$(id -u)" -ne 0 ] && echo "ERR: must be run as: root" && exit 1 + +# Detect the operating system +OS=$(cat /etc/*release | grep -i "centos\|debian" | head -n 1 | awk -F= '{print $2}' | tr -d '[:space:]') + +if [[ "$OS" =~ "CentOS" ]]; then + PACKAGE_MANAGER="dnf" + REPO_INSTALL_CMD="dnf install" + PHP_INSTALL_CMD="dnf module install php:remi-8.3 -y" +elif [[ "$OS" =~ "Debian" ]]; then + PACKAGE_MANAGER="apt" + REPO_INSTALL_CMD="apt-get install" + PHP_INSTALL_CMD="apt-get install php php-cli php-fpm php-pgsql php-yaml php-pdo -y" +else + echo "ERR: Unsupported OS, must be CentOS or Debian." + exit 1 +fi + +# Install necessary repositories for CentOS or Debian +if [[ "$OS" =~ "CentOS" ]]; then + $REPO_INSTALL_CMD https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y + $REPO_INSTALL_CMD https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y + $PHP_INSTALL_CMD +elif [[ "$OS" =~ "Debian" ]]; then + $REPO_INSTALL_CMD lsb-release wget curl -y + # PHP installation is already included in the above command +fi + +# Install required packages (PostgreSQL, Apache, PHP, and utilities) +$REPO_INSTALL_CMD net-tools postgresql postgresql-server httpd php-fpm -y +$REPO_INSTALL_CMD php-pecl-yaml php-pgsql php-pdo -y + +# Setup PostgreSQL +if [[ "$OS" =~ "CentOS" ]]; then + /usr/bin/postgresql-setup --initdb + systemctl enable postgresql + systemctl start postgresql +elif [[ "$OS" =~ "Debian" ]]; then + service postgresql start +fi + +# Configure PostgreSQL to allow external connections securely +cd /var/lib/pgsql/data || exit +cp pg_hba.conf pg_hba.conf.backup + +# Allow connections from any IP (recommended to restrict IP range later) +sed -i 's|host all all 127.0.0.1/32 ident|host all all 0.0.0.0/0 md5|g' pg_hba.conf + +# Restart PostgreSQL to apply changes +systemctl restart postgresql + +# Create the Pandabot database +su - postgres -c 'psql -c "CREATE DATABASE pandabot;"' + +# Display configuration instructions +echo -e "\n------------------------- --- -- - -" +echo "Edit conf/pandabot.conf and conf/channels.conf" +echo "Database settings:" +echo "dbname: pandabot" +echo "dbhost: $(hostname -I | awk '{print $1}')" +echo "dbport: 5432" +echo "dbuser: postgres" +echo "dbpass: " + +echo -e "\nTo setup the Telegram session, run: ./bot.sh setuptg" +echo "To start the bot, run: ./bot.sh start" +echo "To stop the bot, run: ./bot.sh stop" +echo -e "------------------------- --- -- - -\n" + +# Check if firewall is enabled and add necessary rules for PostgreSQL and Apache +if systemctl is-active --quiet firewalld; then + echo "Configuring firewall for PostgreSQL (5432) and HTTP (80/443)" + firewall-cmd --zone=public --add-port=5432/tcp --permanent + firewall-cmd --zone=public --add-service=http --permanent + firewall-cmd --reload +elif ufw status | grep -q "active"; then + echo "Configuring UFW for PostgreSQL (5432) and HTTP (80/443)" + ufw allow 5432/tcp + ufw allow http + ufw allow https + ufw reload +fi + +# SELinux setup for CentOS (optional step, recommended to allow postgresql and httpd) +if [[ "$OS" =~ "CentOS" ]]; then + echo "Setting up SELinux to allow PostgreSQL and Apache to work together" + setsebool -P httpd_can_network_connect_db 1 + setsebool -P httpd_can_network_connect 1 +fi + +echo "Installation and setup complete."