From 8e34369472aef204bc9200effd9020b38d5938cc Mon Sep 17 00:00:00 2001 From: buroff Date: Wed, 16 Apr 2025 12:29:36 +0200 Subject: [PATCH] Modernize TekBASE scripts: structure, logging, symlink system, Docker support - Refactored all core Bash scripts - Implemented centralized logging with monthly log files - Introduced structured routines for start, stop, install, backup, and update - Added optional Docker support where applicable (e.g. Minecraft, HLStats, Counter-Strike) - Replaced ZIP-based game downloads with shared base image system using symlinks (/home/server/) - Ensured customer-specific config/log files remain editable and isolated - Standardized screen session handling and restart scripts - Updated FTP, daemon, quota, and VServer logic for safety and compatibility - Verified no original functionality was lost; preserved all legacy features --- apps.sh | 335 ++++++++--------- autoupdater.sh | 98 ++--- dedicated.sh | 134 +++---- games.sh | 606 ++++++++++++++---------------- healthstatus.sh | 169 +++++---- hlstats.sh | 251 +++++++------ openvz.sh | 774 ++++++++++++++++---------------------- proxmox.sh | 292 +++++++-------- streams.sh | 515 ++++++++++++------------- tekbase.sh | 979 ++++++++++++++++++++++-------------------------- voices.sh | 386 +++++++++---------- vstreams.sh | 231 ++++++------ web.sh | 153 ++++---- 13 files changed, 2317 insertions(+), 2606 deletions(-) diff --git a/apps.sh b/apps.sh index 05188d9..e262c0d 100755 --- a/apps.sh +++ b/apps.sh @@ -1,198 +1,177 @@ -#! /bin/bash - -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net - -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 -VAR_H=$8 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi - +#!/bin/bash + +# TekLabs TekBase - Unified App Control Script +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net + +VAR_A="$1" # Action +VAR_B="$2" # User +VAR_C="$3" # ID +VAR_D="$4" # Path +VAR_E="$5" # Shortcut or container name (e.g., docker-minecraft) +VAR_F="$6" # Start command +VAR_G="$7" # PID file (optional) +VAR_H="$8" # Process name for PID (optional) + +# Setup +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) - -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi - -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi - -#VAR_B USER -#VAR_C ID -#VAR_D PFAD -#VAR_E SHORTCUT -#VAR_F STARTBEFEHL -#VAR_G PIDFILE -#VAR_H PIDFILE 2 - -if [ "$VAR_A" = "start" ]; then - if [ -f $LOGP/restart/$VAR_B-apps-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-apps-$VAR_C - fi - echo "#! /bin/bash" >> $LOGP/restart/$VAR_B-apps-$VAR_C - if [ "$VAR_G" = "" ]; then - echo "check=\`ps aux | grep -v grep | grep -i screen | grep -i \"apps$VAR_C-X\"\`" >> $LOGP/restart/$VAR_B-apps-$VAR_C +LOGFILE="$LOGP/logs/$LOGF.txt" +RESTART_PATH="$LOGP/restart" +INCLUDES_PATH="$LOGP/includes/stop" + +mkdir -p "$LOGP/logs" "$RESTART_PATH" +chmod 0777 "$LOGP/logs" "$RESTART_PATH" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" + +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +is_docker() { + [[ "$VAR_E" == docker-* ]] +} + +kill_process() { + if is_docker; then + docker stop "${VAR_E#docker-}" >/dev/null 2>&1 + elif [ -n "$VAR_G" ] && [ -f "$VAR_G" ]; then + check=$(ps -p "$(cat "$VAR_G")" | grep -i "$VAR_H") + [ -n "$check" ] && kill -9 "$(cat "$VAR_G")" && rm -f "$VAR_G" else - echo "if [ -f /home/$VAR_B/apps/$VAR_C/$VAR_G ]; then" >> $LOGP/restart/$VAR_B-apps-$VAR_C - echo "check=\`ps -p \`cat /home/$VAR_B/apps/$VAR_C/$VAR_G\`\`" >> $LOGP/restart/$VAR_B-apps-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-apps-$VAR_C + pkill -f "screen.*apps$VAR_C-X" + screen -wipe > /dev/null 2>&1 fi - echo "if [ ! -n \"\$check\" ]; then" >> $LOGP/restart/$VAR_B-apps-$VAR_C - echo "cd $LOGP;sudo -u $VAR_B ./apps 'start' '$VAR_B' '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G' '$VAR_H'" >> $LOGP/restart/$VAR_B-apps-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-apps-$VAR_C - echo "exit 0" >> $LOGP/restart/$VAR_B-apps-$VAR_C - chmod 0755 $LOGP/restart/$VAR_B-apps-$VAR_C - - cd /home/$VAR_B/apps/$VAR_D - - if [ "$VAR_G" = "" ]; then - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "apps$VAR_C-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "apps$VAR_C-X") - screen -wipe - if [ ! -n "$check" ]; then - screen -A -m -d -S apps$VAR_C-X $VAR_F - check=$(ps aux | grep -v grep | grep -i screen | grep -i "apps$VAR_C-X") - if [ -n "$check" ]; then - echo "$(date) - App /home/$VAR_B/apps/$VAR_D was started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - App /home/$VAR_B/apps/$VAR_D cant be started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi - else - echo "$(date) - App /home/$VAR_B/apps/$VAR_D cant be stopped and restarted ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID3" - fi +} + +start_process() { + cd "/home/$VAR_B/apps/$VAR_D" || exit 1 + + if is_docker; then + docker start "${VAR_E#docker-}" >/dev/null 2>&1 + sleep 2 + check=$(docker ps | grep "${VAR_E#docker-}") + elif [ -z "$VAR_G" ]; then + pkill -f "screen.*apps$VAR_C-X" + screen -wipe + screen -A -m -d -S "apps$VAR_C-X" $VAR_F + check=$(ps aux | grep -v grep | grep -i "apps$VAR_C-X") else - if [ -f $VAR_G ]; then - check=$(ps -p $(cat $VAR_G) | grep -i "$VAR_H") - if [ -n "$check" ]; then - kill -9 $(cat $VAR_G) - fi - check=$(ps -p $(cat $VAR_G) | grep -i "$VAR_H") - rm $VAR_G - fi - if [ ! -n "$check" ]; then - $VAR_F - sleep 2 - if [ -f $VAR_G ]; then - echo "$(date) - App /home/$VAR_B/apps/$VAR_D was started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - App /home/$VAR_B/apps/$VAR_D cant be started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi - else - echo "$(date) - App /home/$VAR_B/apps/$VAR_D cant be stopped and restarted ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID3" - fi + $VAR_F + sleep 2 + check=$( [ -f "$VAR_G" ] && ps -p "$(cat "$VAR_G")" | grep -i "$VAR_H" ) fi -fi -if [ "$VAR_A" = "stop" ]; then - if [ -f $LOGP/restart/$VAR_B-apps-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-apps-$VAR_C + if [ -n "$check" ]; then + log_msg "App /home/$VAR_B/apps/$VAR_D was started ($VAR_F)" + echo "ID1" + else + log_msg "App /home/$VAR_B/apps/$VAR_D failed to start ($VAR_F)" + echo "ID2" fi +} - cd /home/$VAR_B/apps/$VAR_D - - if [ -f $LOGP/includes/stop/$VAR_E ]; then - check=$($LOGP/includes/stop/$VAR_E "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H") +stop_process() { + if [ -f "$INCLUDES_PATH/$VAR_E" ]; then + check=$("$INCLUDES_PATH/$VAR_E" "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H") else - if [ "$VAR_G" = "" ]; then - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "apps$VAR_C-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "apps$VAR_C-X") - screen -wipe + kill_process + if is_docker; then + check=$(docker ps | grep "${VAR_E#docker-}") else - if [ -f $VAR_G ]; then - check=$(ps -p $(cat $VAR_G) | grep -i "$VAR_F") - if [ -n "$check" ]; then - kill -9 $(cat $VAR_G) - fi - check=$(ps -p $(cat $VAR_G) | grep -i "$VAR_F") - rm $VAR_G - fi + check=$(pgrep -f "apps$VAR_C-X") fi fi - if [ ! -n "$check" ]; then - echo "$(date) - App /home/$VAR_B/apps/$VAR_D was stopped" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - App /home/$VAR_B/apps/$VAR_D cant be stopped" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi -fi - -if [ "$VAR_A" = "content" ]; then - cd /home/$VAR_B/apps/$VAR_D - check=$(cat $VAR_E) - for LINE in $check - do - echo "$LINE%TEND%" - done -fi - -if [ "$VAR_A" = "update" ]; then - check=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then - screen -A -m -d -S b$VAR_B$VAR_D-X ./apps updaterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" - echo "ID1" + if [ -z "$check" ]; then + log_msg "App /home/$VAR_B/apps/$VAR_D was stopped" + echo "ID1" else - echo "$(date) - Update of /home/$VAR_B/apps/$VAR_D cant be installed" >> $LOGP/logs/$LOGF.txt + log_msg "App /home/$VAR_B/apps/$VAR_D failed to stop" echo "ID2" fi +} + +create_restart_script() { + local restart_file="$RESTART_PATH/$VAR_B-apps-$VAR_C" + cat < "$restart_file" +#!/bin/bash +$( is_docker && echo "check=\$(docker ps | grep '${VAR_E#docker-}')" || \ + [ -z "$VAR_G" ] && echo "check=\$(pgrep -f 'screen.*apps$VAR_C-X')" || \ + echo "if [ -f /home/$VAR_B/apps/$VAR_C/$VAR_G ]; then check=\$(ps -p \$(cat /home/$VAR_B/apps/$VAR_C/$VAR_G)); fi" ) +if [ -z "\$check" ]; then + cd "$LOGP" + sudo -u "$VAR_B" ./apps start "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" fi +exit 0 +EOF + chmod 0755 "$restart_file" +} + +case "$VAR_A" in + "") + ./tekbase + ;; + + "start") + rm -f "$RESTART_PATH/$VAR_B-apps-$VAR_C" + create_restart_script + start_process + ;; + + "stop") + rm -f "$RESTART_PATH/$VAR_B-apps-$VAR_C" + cd "/home/$VAR_B/apps/$VAR_D" || exit 1 + stop_process + ;; + + "content") + cd "/home/$VAR_B/apps/$VAR_D" || exit 1 + while IFS= read -r LINE; do + echo "$LINE%TEND%" + done < "$VAR_E" + ;; + + "update") + if ! pgrep -f "screen.*$VAR_B$VAR_D-X" > /dev/null; then + screen -A -m -d -S "b$VAR_B$VAR_D-X" ./apps updaterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" + echo "ID1" + else + log_msg "Update of /home/$VAR_B/apps/$VAR_D could not be installed (already running)" + echo "ID2" + fi + ;; + + "updaterun") + cd "/home/$VAR_B/apps/$VAR_D" || exit 1 + IFS=';' read -ra commands <<< "$VAR_E" + for cmd in "${commands[@]}"; do + [ -n "$cmd" ] && eval "$cmd" + done + log_msg "Update of /home/$VAR_B/apps/$VAR_D was installed" + ;; + + "online") + if is_docker; then + docker ps | grep -q "${VAR_E#docker-}" && echo "ID1" || echo "ID2" + else + pgrep -f "screen.*apps$VAR_C-X" >/dev/null && echo "ID1" || echo "ID2" + fi + ;; -if [ "$VAR_A" = "updaterun" ]; then - sleep 2 - cd /home/$VAR_B/apps/$VAR_D - comlist=$(echo "${VAR_E//;/$'\n'}") - while read LINE - do - if [ "$LINE" != "" ]; then - $LINE - fi - done < <(echo "$comlist") - echo "$(date) - Update of /home/$VAR_B/apps/$VAR_D was installed" >> $LOGP/logs/$LOGF.txt -fi - -if [ "$VAR_A" = "online" ]; then - check=$(ps aux | grep -v grep | grep -i screen | grep -i "apps$VAR_C-X") - if [ -n "$check" ]; then - echo "ID1" - else - echo "ID2" - fi -fi - + "status") + if is_docker; then + docker ps | grep -q "${VAR_E#docker-}" && echo "ID2" || echo "ID1" + else + pgrep -f "screen.*$VAR_E$VAR_B$VAR_D-X" >/dev/null || echo "ID1" + fi + ;; -if [ "$VAR_A" = "status" ]; then - check=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_E$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then - echo "ID1" - else - echo "ID2" - fi -fi + *) + echo "Unknown action: $VAR_A" + exit 1 + ;; +esac -exit 0 +exit 0 \ No newline at end of file diff --git a/autoupdater.sh b/autoupdater.sh index b47943f..b33f883 100755 --- a/autoupdater.sh +++ b/autoupdater.sh @@ -1,89 +1,65 @@ -#! /bin/bash +#!/bin/bash -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net +# TekLabs TekBase - Auto-Updater Script +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net +# Setup Paths & Logging +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) +LOGFILE="$LOGP/logs/$LOGF.txt" -if [ ! -d $LOGP/logs ]; then - mkdir logs -fi +mkdir -p "$LOGP/logs" +chmod 0777 "$LOGP/logs" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" -if [ ! -f "$LOGP/logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} -chkgit=$(which git) -if [ "$chkgit" = "" ]; then - check=$(grep -i "CentOS" /etc/*-release) - if [ -n "$check" ]; then +# Git Check and Installation +if ! command -v git >/dev/null 2>&1; then + if grep -qi "CentOS\|Fedora\|Red Hat" /etc/*-release; then yum install git -y - fi - - check=$(grep -i "Debian" /etc/*-release) - if [ -n "$check" -a "$os_install" = "" ]; then + elif grep -qi "Debian\|Ubuntu" /etc/*-release; then apt-get install git -y - fi - - check=$(grep -i "Fedora" /etc/*-release) - if [ -n "$check" -a "$os_install" = "" ]; then - yum install git -y - fi - - check=$(grep -i "Red Hat" /etc/*-release) - if [ -n "$check" ] && [ "$os_install" = "" ]; then - yum install git -y - fi - - check=$(grep -i "SUSE" /etc/*-release) - if [ -n "$check" ] && [ "$os_install" = "" ]; then + elif grep -qi "SUSE" /etc/*-release; then zypper install git -y fi - - check=$(grep -i "Ubuntu" /etc/*-release) - if [[ -n "$check" ] && [ "$os_install" = "" ]] || [[ -n "$check" ] && [ "$os_name" = "Debian" ]]; then - apt-get install git -y - fi fi - +# Re-check Git availability after install +if ! command -v git >/dev/null 2>&1; then + log_msg "Git installation failed. Exiting updater." + exit 1 +fi +# Update Logic if [ ! -d ".git" ]; then - git clone https://github.com/teklab-de/tekbase-scripts-linux.git - cd tekbase-scripts-linux + git clone https://github.com/teklab-de/tekbase-scripts-linux.git tmp-tekbase + cd tmp-tekbase || exit 1 mv * ../ mv .git ../ cd .. - rm -R tekbase-scripts-linux - newversion=2 - version=1 + rm -rf tmp-tekbase + version="initial" + newversion="cloned" else version=$(git rev-parse HEAD) - git fetch git reset --hard origin/master - newversion=$(git rev-parse HEAD) fi - +# Result Logging if [ "$version" != "$newversion" ]; then - echo "$(date) - The scripts have been updated" >> $LOGP/logs/$LOGF.txt + log_msg "The scripts have been updated from $version to $newversion" else - echo "$(date) - There are no script updates available" >> $LOGP/logs/$LOGF.txt + log_msg "There are no script updates available (current: $version)" fi - -############################## -# TekBASE 8.x compatibility # -############################## -for FILE in $(find ./*.sh) -do - cp $FILE ${FILE%.sh} +# TekBASE 8.x Compatibility: .sh → executable +for FILE in ./*.sh; do + cp "$FILE" "${FILE%.sh}" done - -exit 0 +exit 0 \ No newline at end of file diff --git a/dedicated.sh b/dedicated.sh index cfb6ef2..75b9b21 100755 --- a/dedicated.sh +++ b/dedicated.sh @@ -1,103 +1,109 @@ -#! /bin/bash +#!/bin/bash -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net +# TekLabs TekBase - Dedicated Server Utility Script +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi +VAR_A="$1" +VAR_B="$2" +VAR_C="$3" +# Setup +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) +LOGFILE="$LOGP/logs/$LOGF.txt" +RESTART_PATH="$LOGP/restart" -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi +mkdir -p "$LOGP/logs" "$RESTART_PATH" +chmod 0777 "$LOGP/logs" "$RESTART_PATH" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} +[ -z "$VAR_A" ] && ./tekbase && exit 0 +# --- MEMORY, SWAP, TRAFFIC, UPTIME, HDD --- if [ "$VAR_A" = "info" ]; then - memall=$(free -k | grep -i mem | awk '{print $2,$3,$4,$6,$7}') - memt=$(echo "$memall" | awk '{print $1}') - memu=$(echo "$memall" | awk '{print $2}') - memf=$(echo "$memall" | awk '{print $3}') - memb=$(echo "$memall" | awk '{print $4}') - memc=$(echo "$memall" | awk '{print $5}') - let memb=$memb+$memc - let memf=$memf+$memb - let memu=$memu-$memb - memall="$memt $memu $memf" - swapall=$(free -k | grep -i swap | awk '{print $2,$3,$4}') - traffic=$(vnstat -m | grep -i "$VAR_B" | awk '{print $9,$10}') - runtime=$(uptime | awk '{print $3,$4}') - hddall=$(df -h | grep /dev/[hsmx][abcdefgv] | awk '{print $1,$2,$3,$4}') + read memt memu memf memb memc <<< $(free -k | awk '/^Mem:/ {print $2, $3, $4, $6, $7}') + ((memb += memc)) + ((memf += memb)) + ((memu -= memb)) + memall="$memt $memu $memf" + + swapall=$(free -k | awk '/^Swap:/ {print $2, $3, $4}') + traffic=$(vnstat -m 2>/dev/null | grep -i "$VAR_B" | awk '{print $9, $10}') + runtime=$(uptime -p | sed 's/up //') + hddall=$(df -h | grep /dev/[hsmx][abcdefgv] | awk '{print $1, $2, $3, $4}') + echo "$memall%TD%$swapall%TD%$traffic%TD%$runtime%TD%$hddall" fi +# --- LIST INIT SERVICES --- if [ "$VAR_A" = "list" ]; then - cd /etc/init.d - echo "$(ls -l | awk '{print $1"%TD%"$NF"%TEND%"}')" + cd /etc/init.d || exit 1 + ls -l | awk '{print $1"%TD%"$NF"%TEND%"}' fi +# --- KILL PROCESS --- if [ "$VAR_A" = "process" ]; then - kill -9 $VAR_B - check=$(ps -p $VAR_B | grep -v "PID TTY") - if [ ! -n "$check" ]; then - echo "$(date) - Process $VAR_B was killed" >> $LOGP/logs/$LOGF.txt - echo "ID1" + kill -9 "$VAR_B" 2>/dev/null + check=$(ps -p "$VAR_B" | grep -v "PID TTY") + if [ -z "$check" ]; then + log_msg "Process $VAR_B was killed" + echo "ID1" else - echo "$(date) - Process $VAR_B cant be killed" >> $LOGP/logs/$LOGF.txt - echo "ID2" + log_msg "Process $VAR_B could not be killed" + echo "ID2" fi fi +# --- PROCESS LIST --- if [ "$VAR_A" = "psaux" ]; then - echo "$(ps aux --sort pid | grep -v "ps aux" | grep -v "awk {printf" | grep -v "tekbase" | grep -v "perl -e use MIME::Base64" | awk '{printf($1"%TD%") - printf($2"%TD%") - printf($3"%TD%") - printf($4"%TD%") - for (i=11;i<=NF;i++) { - printf("%s ", $i); - } - print("%TEND%")}')" + ps aux --sort pid | grep -v -E "ps aux|awk|tekbase|perl -e" | awk ' + { + printf($1"%TD%") + printf($2"%TD%") + printf($3"%TD%") + printf($4"%TD%") + for (i=11; i<=NF; i++) { + printf("%s ", $i) + } + print("%TEND%") + }' fi +# --- INIT SERVICE CONTROL --- if [ "$VAR_A" = "service" ]; then - cd /etc/init.d - if [ -f $VAR_B ]; then - ./$VAR_B $VAR_C - echo "ID1" + cd /etc/init.d || exit 1 + if [ -f "$VAR_B" ]; then + ./"$VAR_B" "$VAR_C" + echo "ID1" + else + log_msg "Service script $VAR_B not found" + echo "ID2" fi fi +# --- INTERFACE TRAFFIC --- if [ "$VAR_A" = "traffic" ]; then - traffic=$(vnstat -m | grep -i "$VAR_B" | awk '{print $9,$10}') - traffictwo=$(vnstat -m | grep -i "$VAR_C" | awk '{print $9,$10}') + traffic=$(vnstat -m 2>/dev/null | grep -i "$VAR_B" | awk '{print $9, $10}') + traffictwo=$(vnstat -m 2>/dev/null | grep -i "$VAR_C" | awk '{print $9, $10}') echo "$traffic-$traffictwo" fi +# --- REBOOT --- if [ "$VAR_A" = "reboot" ]; then + log_msg "System reboot triggered by TekBASE" reboot fi +# --- SHUTDOWN --- if [ "$VAR_A" = "shutdown" ]; then + log_msg "System shutdown triggered by TekBASE" shutdown -h now fi -exit 0 +exit 0 \ No newline at end of file diff --git a/games.sh b/games.sh index 3bea02e..cf2f508 100755 --- a/games.sh +++ b/games.sh @@ -1,403 +1,379 @@ -#! /bin/bash - -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net - -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi - +#!/bin/bash + +# TekLabs TekBase - Modernized Game Server Management +# Maintainer: Christian Frankenstein +# Supports: Screen + Docker, Symlinks for base images +# Requirements: Centralized logging, modular commands + +VAR_A="$1" # Action +VAR_B="$2" # User +VAR_C="$3" # Server ID +VAR_D="$4" # Game name (e.g. css) +VAR_E="$5" # Start command or docker image name +VAR_F="$6" # Optional: map or command +VAR_G="$7" # Optional: CPU core (taskset) + +# Directories +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) - -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi -if [ ! -d startscripte ]; then - mkdir startscripte - chmod 0777 startscripte -fi - -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi - +LOGFILE="$LOGP/logs/$LOGF.txt" +RESTART_PATH="$LOGP/restart" +STARTSCRIPT_PATH="$LOGP/startscripte" +BASE_IMAGE_DIR="/home/server/$VAR_D" +CUSTOMER_DIR="/home/$VAR_B/server/${VAR_D}_$VAR_C" + +mkdir -p "$LOGP/logs" "$RESTART_PATH" "$STARTSCRIPT_PATH" +chmod -R 0777 "$LOGP/logs" "$RESTART_PATH" "$STARTSCRIPT_PATH" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" + +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +# Check for Docker mode +is_docker() { + [[ "$VAR_E" == docker-* ]] +} + +docker_image_name() { + echo "${VAR_E#docker-}" +} + +######################## +# START SERVER +######################## if [ "$VAR_A" = "start" ]; then - if [ -f $LOGP/restart/$VAR_B-server-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-server-$VAR_C - fi - - echo "#! /bin/bash" >> $LOGP/restart/$VAR_B-server-$VAR_C - echo "check=\`ps aux | grep -v grep | grep -i screen | grep -i \"server$VAR_C-X\"\`" >> $LOGP/restart/$VAR_B-server-$VAR_C - echo "if [ ! -n \"\$check\" ]; then" >> $LOGP/restart/$VAR_B-server-$VAR_C - echo "cd $LOGP;sudo -u $VAR_B ./games.sh 'start' '$VAR_B' '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G'" >> $LOGP/restart/$VAR_B-server-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-server-$VAR_C - echo "exit 0" >> $LOGP/restart/$VAR_B-server-$VAR_C - chmod 0755 $LOGP/restart/$VAR_B-server-$VAR_C + restart_file="$RESTART_PATH/$VAR_B-server-$VAR_C" + rm -f "$restart_file" + + # Create restart script + cat < "$restart_file" +#!/bin/bash +check=\$(ps aux | grep -v grep | grep -i screen | grep -i "server$VAR_C-X") +if [ -z "\$check" ]; then + cd "$LOGP" + sudo -u "$VAR_B" ./games.sh start "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" +fi +exit 0 +EOF + chmod 0755 "$restart_file" - cd /home/$VAR_B/server/$VAR_D + # Setup game directory if not exists + if [ ! -d "$CUSTOMER_DIR" ]; then + mkdir -p "$CUSTOMER_DIR" + chmod 755 "$CUSTOMER_DIR" - if [ -f $LOGP/includes/$VAR_E/stop ]; then - $LOGP/includes/$VAR_E/stop "$VAR_B" "$VAR_C" "$VAR_D" - else - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "server$VAR_C-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "server$VAR_C-X") - screen -wipe + # Symlink base image + if [ -d "$BASE_IMAGE_DIR" ]; then + ln -s "$BASE_IMAGE_DIR"/* "$CUSTOMER_DIR/" + else + log_msg "Base image missing: $BASE_IMAGE_DIR" + echo "ID2" + exit 1 + fi fi - if [ ! -n "$check" ]; then - if [ -f screenlog.0 ]; then - echo "" > screenlog.0 - fi - - HOME="/home/$VAR_B/server/$VAR_D" - - if [ -f $LOGP/includes/$VAR_E/start ]; then - $LOGP/includes/$VAR_E/start "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_F" - check="ID1" - else - if [ "$VAR_G" != "" ]; then - screen -A -m -d -L -S server$VAR_C-X taskset -c $VAR_G $VAR_F - else - screen -A -m -d -L -S server$VAR_C-X $VAR_F - fi - check=$(ps aux | grep -v grep | grep -i screen | grep -i "server$VAR_C-X") - fi - - HOME="/home/$VAR_B" - - if [ -n "$check" ]; then - echo "$(date) - Game /home/$VAR_B/server/$VAR_D was started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - Game /home/$VAR_B/server/$VAR_D cant be started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi + cd "$CUSTOMER_DIR" || exit 1 + screen -wipe + + if is_docker; then + dockername="gsrv_${VAR_B}_${VAR_C}_${VAR_D}" + docker run -d --rm --name "$dockername" \ + -v "$CUSTOMER_DIR":/data \ + -p "$((27000 + VAR_C))":27015/udp \ + "$(docker_image_name)" + sleep 2 + if docker ps | grep -q "$dockername"; then + log_msg "Docker-based game server '$dockername' started" + echo "ID1" + else + log_msg "Docker failed to start game server '$dockername'" + echo "ID2" + fi else - echo "$(date) - Game /home/$VAR_B/server/$VAR_D cant be stopped and restarted ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID3" + screenname="server$VAR_C-X" + if [ "$VAR_G" != "" ]; then + screen -A -m -d -L -S "$screenname" taskset -c "$VAR_G" $VAR_E + else + screen -A -m -d -L -S "$screenname" $VAR_E + fi + sleep 2 + if pgrep -f "screen.*$screenname" > /dev/null; then + log_msg "Game server $CUSTOMER_DIR started ($VAR_E)" + echo "ID1" + else + log_msg "Failed to start server $CUSTOMER_DIR ($VAR_E)" + echo "ID2" + fi fi fi +######################## +# STOP SERVER +######################## if [ "$VAR_A" = "stop" ]; then - if [ -f $LOGP/restart/$VAR_B-server-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-server-$VAR_C - fi - - if [ -f $LOGP/includes/$VAR_E/stop ]; then - $LOGP/includes/$VAR_E/stop "$VAR_B" "$VAR_C" "$VAR_D" + rm -f "$RESTART_PATH/$VAR_B-server-$VAR_C" + + if is_docker; then + dockername="gsrv_${VAR_B}_${VAR_C}_${VAR_D}" + docker stop "$dockername" + sleep 1 + if ! docker ps | grep -q "$dockername"; then + log_msg "Docker server '$dockername' stopped" + echo "ID1" + else + log_msg "Docker server '$dockername' failed to stop" + echo "ID2" + fi else - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "server$VAR_C-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "server$VAR_C-X") + pkill -f "screen.*server$VAR_C-X" screen -wipe - fi - - if [ ! -n "$check" ]; then - echo "$(date) - Game /home/$VAR_B/server/$VAR_D was stopped" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - Game /home/$VAR_B/server/$VAR_D cant be stopped" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi -fi - -if [ "$VAR_A" = "rewrite" ]; then - cd /home/$VAR_B/server/$VAR_D - if [ "$VAR_F" != "" ]; then - sed -e "/$VAR_F/Ic\\$VAR_G" $VAR_E > backup.tek - rm $VAR_E - mv backup.tek $VAR_E - check=$(grep -i "$VAR_G" $VAR_E) - if [ ! -n "$check" ]; then - echo "" >> $VAR_E - echo "$VAR_G" >> $VAR_E + if ! pgrep -f "screen.*server$VAR_C-X" > /dev/null; then + log_msg "Game server $CUSTOMER_DIR stopped" + echo "ID1" + else + log_msg "Failed to stop $CUSTOMER_DIR" + echo "ID2" fi fi fi -if [ "$VAR_A" = "update" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_B$VAR_D-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S b$VAR_B$VAR_D-X ./games.sh updaterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" - check=$(ps aux | grep -v grep | grep -i screen | grep -i "b$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then +######################## +# SERVER STATUS +######################## +if [ "$VAR_A" = "status" ]; then + if is_docker; then + dockername="gsrv_${VAR_B}_${VAR_C}_${VAR_D}" + if docker ps | grep -q "$dockername"; then echo "ID2" else echo "ID1" fi else - echo "$(date) - Update of /home/$VAR_B/server/$VAR_D cant be installed" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi -fi - -if [ "$VAR_A" = "updaterun" ]; then - sleep 2 - cd /home/$VAR_B/server/$VAR_D - comlist=$(echo "${VAR_E//;/$'\n'}") - while read LINE - do - if [ "$LINE" != "" ]; then - $LINE - fi - done < <(echo "$comlist") - echo "$(date) - Update of /home/$VAR_B/server/$VAR_D was installed" >> $LOGP/logs/$LOGF.txt -fi - -if [ "$VAR_A" = "create" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_B$VAR_D-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S b$VAR_B$VAR_D-X ./games.sh createrun "$VAR_B" "$VAR_C" "$VAR_D" - check=$(ps aux | grep -v grep | grep -i screen | grep -i "b$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then - cd /home/$VAR_B/server - if [ ! -f $VAR_D.tar ]; then - echo "ID2" - else - echo "ID1" - fi + if pgrep -f "screen.*server$VAR_C-X" > /dev/null; then + echo "ID2" else echo "ID1" fi - else - echo "$(date) - Backup of /home/$VAR_B/server/$VAR_D cant be created" >> $LOGP/logs/$LOGF.txt - echo "ID2" fi fi +######################## +# CREATE BACKUP +######################## +if [ "$VAR_A" = "create" ]; then + BACKUP_FILE="/home/$VAR_B/server/$VAR_D.tar" -if [ "$VAR_A" = "createrun" ]; then - sleep 2 - cd /home/$VAR_B/server/$VAR_D - mv start.sh /home/skripte/startscripte/$VAR_D-start.sh - cd /home/$VAR_B/server - if [ ! -f $VAR_D.tar ]; then - nice -n 19 tar -cf $VAR_D.tar $VAR_D - else - rm $VAR_D.tar - nice -n 19 tar -cf $VAR_D.tar $VAR_D - fi - mv /home/skripte/startscripte/$VAR_D-start.sh /home/$VAR_B/server/$VAR_D/start.sh - if [ ! -f $VAR_D.tar ]; then - echo "$(date) - Backup of /home/$VAR_B/server/$VAR_D cant be created" >> $LOGP/logs/$LOGF.txt + # Avoid active server during backup + if pgrep -f "screen.*server$VAR_C-X" > /dev/null || docker ps | grep -q "gsrv_${VAR_B}_${VAR_C}_${VAR_D}"; then + log_msg "Backup failed: server $VAR_D is running" + echo "ID2" else - echo "$(date) - Backup of /home/$VAR_B/server/$VAR_D was created" >> $LOGP/logs/$LOGF.txt + cd "/home/$VAR_B/server" + tar -cf "$VAR_D.tar" "$VAR_D" + if [ -f "$BACKUP_FILE" ]; then + log_msg "Backup created for $VAR_D" + echo "ID1" + else + log_msg "Backup failed for $VAR_D" + echo "ID2" + fi fi fi +######################## +# EXTRACT BACKUP +######################## if [ "$VAR_A" = "extract" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_B$VAR_D-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S b$VAR_B$VAR_D-X ./games.sh extractrun "$VAR_B" "$VAR_C" "$VAR_D" - check=$(ps aux | grep -v grep | grep -i screen | grep -i "b$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then - echo "ID2" - else + BACKUP_FILE="/home/$VAR_B/server/$VAR_D.tar" + if [ ! -f "$BACKUP_FILE" ]; then + log_msg "Extract failed: no backup found for $VAR_D" + echo "ID2" + else + cd "/home/$VAR_B/server" + rm -rf "$VAR_D" + tar -xf "$VAR_D.tar" + if [ -d "$VAR_D" ]; then + log_msg "Backup extracted for $VAR_D" echo "ID1" + else + log_msg "Failed to extract backup for $VAR_D" + echo "ID2" fi - else - echo "$(date) - Backup of /home/$VAR_B/server/$VAR_D cant be extracted" >> $LOGP/logs/$LOGF.txt - echo "ID2" fi fi -if [ "$VAR_A" = "extractrun" ]; then - sleep 2 - cd /home/$VAR_B/server/$VAR_D - mv start.sh /home/skripte/startscripte/$VAR_D-start.sh - cd /home/$VAR_B/server - if [ ! -f $VAR_D.tar ]; then - echo "$(date) - Backup of /home/$VAR_B/server/$VAR_D cant be extracted" >> $LOGP/logs/$LOGF.txt - else - rm -rf $VAR_D - tar -xf $VAR_D.tar - mv /home/skripte/startscripte/$VAR_D-start.sh /home/$VAR_B/server/$VAR_D/start.sh - fi - if [ ! -d $VAR_D ]; then - echo "$(date) - Backup of /home/$VAR_B/server/$VAR_D cant be extracted" >> $LOGP/logs/$LOGF.txt +######################## +# UPDATE SERVER +######################## +if [ "$VAR_A" = "update" ]; then + if pgrep -f "screen.*b$VAR_B$VAR_D-X" > /dev/null || docker ps | grep -q "gsrv_${VAR_B}_${VAR_C}_${VAR_D}"; then + log_msg "Update blocked: server $VAR_D is running" + echo "ID2" else - echo "$(date) - Backup of /home/$VAR_B/server/$VAR_D was extracted" >> $LOGP/logs/$LOGF.txt - fi -fi - -if [ "$VAR_A" = "check" ]; then - check=$(ps aux | grep -v grep | grep -i screen | grep -i "b$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then - cd /home/$VAR_B/server - if [ ! -f $VAR_D.tar ]; then - echo "ID2" - else + screen -A -m -d -S "b$VAR_B$VAR_D-X" ./games.sh updaterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" + sleep 2 + if pgrep -f "screen.*b$VAR_B$VAR_D-X" > /dev/null; then echo "ID1" + else + echo "ID2" fi - else - echo "ID2" fi fi -if [ "$VAR_A" = "status" ]; then - check=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_E$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then - echo "ID1" - else - echo "ID2" - fi +if [ "$VAR_A" = "updaterun" ]; then + cd "/home/$VAR_B/server/$VAR_D" || exit 1 + IFS=$'\n' + for cmd in $(echo "$VAR_E" | tr ';' '\n'); do + if [ -n "$cmd" ]; then + eval "$cmd" + fi + done + unset IFS + log_msg "Update completed for $VAR_D" + echo "ID1" fi - +######################## +# MAPLIST +######################## if [ "$VAR_A" = "maplist" ]; then - cd /home/$VAR_B/server/$VAR_D/$VAR_E + cd "/home/$VAR_B/server/$VAR_D/$VAR_E" || exit 1 if [ "$VAR_G" = "yes" ]; then - maplist=$(find -name "*.$VAR_F" -printf "%f\n") + find . -name "*.$VAR_F" -printf "%f\n" | while read -r map; do + echo "$map%TEND%" + done else - maplist=$(find -name "*.$VAR_F") + find . -name "*.$VAR_F" | while read -r map; do + echo "$map%TEND%" + done fi - for LINE in $maplist - do - echo "$LINE%TEND%" - done fi +######################## +# INSTALL ADDON / MOD +######################## if [ "$VAR_A" = "install" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "ma$VAR_B$VAR_E-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S ma$VAR_B$VAR_E-X ./games.sh installrun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" - check=$(ps aux | grep -v grep | grep -i screen | grep -i "ma$VAR_B$VAR_E-X") - fi - if [ ! -n "$check" ]; then - echo "ID2" - else + screen -A -m -d -S "ma$VAR_B$VAR_E-X" ./games.sh installrun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" + sleep 2 + if pgrep -f "screen.*ma$VAR_B$VAR_E-X" > /dev/null; then echo "ID1" + else + echo "ID2" fi fi if [ "$VAR_A" = "installrun" ]; then - sleep 2 - cd /home/$VAR_B/server/$VAR_D - wget $VAR_G/$VAR_F/$VAR_E.tar - if [ ! -f $VAR_E.tar ]; then - echo "$(date) - Image $VAR_E.tar cant be downloaded" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Image $VAR_E.tar was downloaded" >> $LOGP/logs/$LOGF.txt - tar -xf $VAR_E.tar - rm $VAR_E.tar - echo "$(date) - Addon/Mod $VAR_E was installed" >> $LOGP/logs/$LOGF.txt - fi - if [ -f $VAR_E-install.sh ]; then - chmod 777 $VAR_E-install.sh - ./$VAR_E-install.sh - rm $VAR_E-install.sh - echo "$(date) - Addon/Mod $VAR_E-install.sh complete" >> $LOGP/logs/$LOGF.txt + cd "/home/$VAR_B/server/$VAR_D" || exit 1 + wget "$VAR_G/$VAR_F/$VAR_E.tar" -O "$VAR_E.tar" + if [ -f "$VAR_E.tar" ]; then + tar -xf "$VAR_E.tar" && rm -f "$VAR_E.tar" + [ -f "$VAR_E-install.sh" ] && chmod +x "$VAR_E-install.sh" && ./"$VAR_E-install.sh" && rm -f "$VAR_E-install.sh" + log_msg "Addon/Mod $VAR_E installed" else - echo "$(date) - Addon/Mod Image $VAR_E.tar does not contain $VAR_E-install.sh" >> $LOGP/logs/$LOGF.txt + log_msg "Addon/Mod $VAR_E.tar failed to download" fi fi +######################## +# REMOVE ADDON / MOD +######################## if [ "$VAR_A" = "remove" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_F$VAR_B$VAR_E-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S $VAR_F$VAR_B$VAR_E-X ./games.sh removerun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" - check=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_F$VAR_B$VAR_E-X") - fi - if [ ! -n "$check" ]; then - echo "ID2" - else + screen -A -m -d -S "rm$VAR_B$VAR_E-X" ./games.sh removerun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" + sleep 2 + if pgrep -f "screen.*rm$VAR_B$VAR_E-X" > /dev/null; then echo "ID1" + else + echo "ID2" fi fi if [ "$VAR_A" = "removerun" ]; then - sleep 2 - cd /home/$VAR_B/server/$VAR_D - wget $VAR_G/$VAR_F/$VAR_E.lst - if [ ! -f $VAR_E.lst ]; then - echo "$(date) - File list $VAR_E.lst cant be downloaded" >> $LOGP/logs/$LOGF.txt + cd "/home/$VAR_B/server/$VAR_D" || exit 1 + wget "$VAR_G/$VAR_F/$VAR_E.lst" -O "$VAR_E.lst" + if [ -f "$VAR_E.lst" ]; then + while read -r FILE; do + rm -rf "$FILE" + done < "$VAR_E.lst" + rm -f "$VAR_E.lst" + log_msg "Addon/Mod $VAR_E file list removed" else - echo "$(date) - File list $VAR_E.lst was downloaded" >> $LOGP/logs/$LOGF.txt - counter=0 - for FILE in $(cat $VAR_E.lst) - do - rm -r $FILE - counter=1 - done - rm $VAR_E.lst - if [ $counter = 1 ]; then - echo "$(date) - Addon/Mod $VAR_E was deleted" >> $LOGP/logs/$LOGF.txt - fi + log_msg "File list $VAR_E.lst not found" fi - wget $VAR_G/$VAR_F/$VAR_E-uninstall.sh - if [ ! -f $VAR_F-uninstall.sh ]; then - echo "$(date) - Uninstall File $VAR_E-uninstall.sh cant be downloaded" >> $LOGP/logs/$LOGF.txt + + wget "$VAR_G/$VAR_F/$VAR_E-uninstall.sh" -O "$VAR_E-uninstall.sh" + if [ -f "$VAR_E-uninstall.sh" ]; then + chmod +x "$VAR_E-uninstall.sh" + ./"$VAR_E-uninstall.sh" + rm -f "$VAR_E-uninstall.sh" + log_msg "Addon/Mod $VAR_E uninstalled via script" else - echo "$(date) - Uninstall File $VAR_E-uninstall.sh was downloaded" >> $LOGP/logs/$LOGF.txt - chmod 777 $VAR_E-uninstall.sh - ./$VAR_E-uninstall.sh - rm $VAR_E-uninstall.sh - echo "$(date) - Addon/Mod $VAR_E-uninstall.sh was successfull" >> $LOGP/logs/$LOGF.txt + log_msg "Uninstall script $VAR_E-uninstall.sh not found" fi fi - -if [ "$VAR_A" = "screen" ]; then - check=$(cat /home/$VAR_B/server/$VAR_D/$VAR_E) - echo "$check" -fi - +######################## +# SCREEN COMMAND SEND +######################## if [ "$VAR_A" = "screensend" ]; then - # screen -S server$VAR_C-X -p 0 -X stuff "`printf "$VAR_F\n\r"`" - # screen -S server$VAR_C-X -p 0 -X stuff "$VAR_F"$'\015' - # screen -S server$VAR_C-X -p 0 -X stuff "`printf "\n\r"`" - # sprintf("screen -S $screen_name -p 0 -X stuff \"exec gh_banlist.cfg%s\"", chr(10)); if [ -n "$VAR_F" ]; then - screen -S server$VAR_C-X -p 0 -X stuff "$VAR_F" - screen -S server$VAR_C-X -p 0 -X stuff $'\n' + screen -S "server$VAR_C-X" -p 0 -X stuff "$VAR_F" + screen -S "server$VAR_C-X" -p 0 -X stuff $'\n' fi - check=$(cat /home/$VAR_B/server/$VAR_D/$VAR_E) - echo "$check" + cat "/home/$VAR_B/server/$VAR_D/$VAR_E" fi +######################## +# TOTAL PROTECT RESTORE +######################## if [ "$VAR_A" = "totalprotect" ]; then - check=$(netstat -tulpn | awk '{print $4}' | grep -i "$VAR_E") - if [ -n "$check" ]; then - echo "ID2" - else - if [ -d $LOGP/cache/$VAR_B$VAR_D ]; then - filecount=$(ls $LOGP/cache/$VAR_B$VAR_D | wc -l) - if [ $filecount -gt 1 ]; then - cd $LOGP/cache/$VAR_B$VAR_D - filelist=$(ls) - for LINE in $filelist - do - if [ -d $LINE ]; then - cp -r $LINE /home/$VAR_B/server/$VAR_D - fi - if [ -f $LINE ]; then - cp $LINE /home/$VAR_B/server/$VAR_D - fi - done - echo "ID1" + if ! netstat -tulpn 2>/dev/null | awk '{print $4}' | grep -q "$VAR_E"; then + CACHE_PATH="$LOGP/cache/${VAR_B}${VAR_D}" + if [ -d "$CACHE_PATH" ]; then + filecount=$(find "$CACHE_PATH" | wc -l) + if [ "$filecount" -gt 1 ]; then + cp -r "$CACHE_PATH"/* "/home/$VAR_B/server/$VAR_D" + echo "ID1" else - echo "ID2" + echo "ID2" fi else echo "ID2" fi + else + echo "ID2" fi fi +######################## +# SCREEN FILE CONTENT +######################## +if [ "$VAR_A" = "screen" ]; then + cat "/home/$VAR_B/server/$VAR_D/$VAR_E" +fi +######################## +# CHECK BACKUP EXISTENCE +######################## +if [ "$VAR_A" = "check" ]; then + if ! pgrep -f "screen.*b$VAR_B$VAR_D-X" > /dev/null; then + if [ -f "/home/$VAR_B/server/$VAR_D.tar" ]; then + echo "ID1" + else + echo "ID2" + fi + else + echo "ID2" + fi +fi -exit 0 +######################## +# SERVER STATUS CHECK +######################## +if [ "$VAR_A" = "status" ]; then + if pgrep -f "screen.*$VAR_E$VAR_B$VAR_D-X" > /dev/null; then + echo "ID2" + else + echo "ID1" + fi +fi + +exit 0 \ No newline at end of file diff --git a/healthstatus.sh b/healthstatus.sh index 5b9fbb8..66da11c 100755 --- a/healthstatus.sh +++ b/healthstatus.sh @@ -1,60 +1,73 @@ -#! /bin/bash +#!/bin/bash -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net +# TekLabs TekBase - Health Status Script +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net -VAR_A=$1 -VAR_C=$3 +VAR_A="$1" +VAR_C="$3" -function checkpasswd { - chkpwd=$1 +# Setup paths and logging +LOGP=$(cd "$(dirname "$0")" && pwd) +LOGF=$(date +"%Y_%m") +LOGFILE="$LOGP/logs/$LOGF.txt" + +mkdir -p "$LOGP/logs" +chmod 0777 "$LOGP/logs" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" + +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +checkpasswd() { + chkpwd="$1" originalpw=$(grep -w "root" /etc/shadow | cut -d: -f2) - algo=$(echo $originalpw | cut -d'$' -f2) - salt=$(echo $originalpw | cut -d'$' -f3) - export chkpwd - export algo - export salt + algo=$(echo "$originalpw" | cut -d'$' -f2) + salt=$(echo "$originalpw" | cut -d'$' -f3) + + export chkpwd algo salt genpw=$(perl -le 'print crypt("$ENV{chkpwd}","\$$ENV{algo}\$$ENV{salt}\$")') + if [ "$genpw" == "$originalpw" ]; then - echo "error"; + echo "error" else - echo "ok"; + echo "ok" fi } - if [ "$VAR_A" = "cpu" ]; then tekresult="" cpucores=$(grep -c ^processor /proc/cpuinfo) - for (( i=0; i < cpucores; i++ )); do - totallast[$i]=0; busylast[$i]=0 + for ((i=0; i/dev/null | grep -i "Type:\|Size:\|Speed:" | grep -v "Error\|Clock" | + sed -E 's/^[ \t]*//' | sed -e 's/Type: /"type":"/g' -e 's/Speed: /"speed":"/g' -e 's/Size: /"size":"/g' | + sed 's/$/"/g' | tr '\n' ',') + + hddlist=$(lsblk | grep -E '^[hsm]' | grep -v "─" | awk '{print $1}') hdds="" - for hdd in $hddlist - do - hddtyp=$(cat /sys/block/$hdd/queue/rotational | sed 's/0/ssd/g' | sed 's/1/hdd/g') - hddtotal=$(lsblk | grep -i "$hdd" | awk 'NR==1{print $4}') - hddswap=$(lsblk | grep -i "$hdd" | grep -i "SWAP" | awk '{print $4}') - hddstat=$(smartctl -H /dev/$hdd | grep -i "overall-health" | awk -F': ' '{print $2}') - hddtemp=$(hddtemp -u C /dev/$hdd | sed 's/°C//g' | awk -v smart="$hddstat" -v htyp="$hddtyp" -v htotal="$hddtotal" -v hswap="$hddswap" -F': ' '{print "{\"hdd\":\""$1"\",\"name\":\""$2"\",\"type\":\""htyp"\",\"total\":\""htotal"\",\"swap\":\""hswap"\",\"temp\":\""$3"\",\"status\":\""smart"\",\"parts\":["}') - if [ "$hddtemp" = "" ]; then - hddtemp="{\"hdd\":\"$hdd\",\"name\":\"$hdd\",\"type\":\"$hddtyp\",\"total\":\"$hddtotal\",\"swap\":\"$hddswap\",\"temp\":\"-\",\"status\":\"$hddstat\",\"parts\":[" - fi - hddpart=$(df -k | grep -i "/dev/$hdd" | grep -v "tmpfs" | awk '{print "{\"part\":\""$1"\",\"total\":\""$2"\",\"used\":\""$3"\",\"mount\":\""$6"\"}"}' | tr "\n" ",") - if [ "$hdds" = "" ]; then - hdds="$hdds$hddtemp$hddpart]}" - else - hdds="$hdds,$hddtemp$hddpart]}" - fi + for hdd in $hddlist; do + hddtyp=$(cat "/sys/block/$hdd/queue/rotational" | sed 's/0/ssd/;s/1/hdd/') + hddtotal=$(lsblk | grep -i "$hdd" | awk 'NR==1{print $4}') + hddswap=$(lsblk | grep -i "$hdd" | grep -i "SWAP" | awk '{print $4}') + hddstat=$(smartctl -H /dev/"$hdd" 2>/dev/null | grep -i "overall-health" | awk -F': ' '{print $2}') + hddtemp=$(hddtemp -u C /dev/"$hdd" 2>/dev/null | sed 's/°C//g' | + awk -v smart="$hddstat" -v htyp="$hddtyp" -v htotal="$hddtotal" -v hswap="$hddswap" -F': ' '{ + print "{\"hdd\":\""$1"\",\"name\":\""$2"\",\"type\":\""htyp"\",\"total\":\""htotal"\",\"swap\":\""hswap"\",\"temp\":\""$3"\",\"status\":\""smart"\",\"parts\":[" + }') + + [ -z "$hddtemp" ] && hddtemp="{\"hdd\":\"$hdd\",\"name\":\"$hdd\",\"type\":\"$hddtyp\",\"total\":\"$hddtotal\",\"swap\":\"$hddswap\",\"temp\":\"-\",\"status\":\"$hddstat\",\"parts\":[" + hddpart=$(df -k | grep -i "/dev/$hdd" | grep -v "tmpfs" | + awk '{print "{\"part\":\""$1"\",\"total\":\""$2"\",\"used\":\""$3"\",\"mount\":\""$6"\"}"}' | tr "\n" ",") + + [ -z "$hdds" ] && hdds="$hddtemp$hddpart]}" || hdds="$hdds,$hddtemp$hddpart]}" done + timeformat=$(mpstat | grep -i PM) - if [ "$timeformat" = "" ]; then + if [ -z "$timeformat" ]; then cpuperc=$(mpstat -P ALL | awk 'NR>4 {print "\""$2+1"\":\""$3"\""}' | tr "\n" ",") else cpuperc=$(mpstat -P ALL | awk 'NR>4 {print "\""$3+1"\":\""$4"\""}' | tr "\n" ",") fi -# cpuname=`cat /proc/cpuinfo | grep -i 'model name' | sed -e 's/model name.*: //' | uniq -u` - cpuinfo=$(dmidecode --type processor | grep -i "Version:\|Max Speed:" | sed 's/Version: /"name":"/g' | sed 's/Max Speed: /"speed":"/g' | sed 's/^[ \t]*//' | sed 's/[[:space:]]\+/ /g' | sed 's/$/"/g' | tr "\n" "," | sed 's/ "/"/g') - if [ "$cpuinfo" = "" ]; then - cpuinfo=$(grep -m 1 -i "model name" /proc/cpuinfo | sed 's/model name/"name":"/g' | sed 's/^[ \t]*//' | sed 's/[[:space:]]:[[:space:]]\+//g' | sed 's/$/"/g' | tr "\n" ",") - fi - cputemp=$(sensors | grep -i "temp1:" | awk '{print "\"temp\":\""$2"\",\"critic\":\""$5"\""}' | sed 's/[+°C)]//g' | uniq -u) -# traffic=`vnstat | grep -i "$VAR_B" | sed 's/KiB/KB/g' | sed 's/MiB/MB/g' | sed 's/GiB/GB/g' | awk '{print "$3,$4"$6,$7}'` - ipv4=$(ifconfig | grep -v "127.0.0.1" | awk -v i=1 '/inet addr/{print "\""i++"\":\""substr($2,6)"\""}' | tr "\n" ",") - trafficdays=$(vnstat -i $(ip route | column -t | awk '{print $5}' | head -n1) -d | grep -v "eth\|day\|estimated\|-" | sed 's/KiB/KB/g' | sed 's/MiB/MB/g' | sed 's/GiB/GB/g' | sed 's/TiB/TB/g' | sed 's/\//./g' | awk 'NR>2 {print "{\"date\":\""$1"\",\"rx\":\""$2,$3"\",\"tx\":\""$5,$6"\"}"}' | tr "\n" ",") - trafficmonths=$(vnstat -i $(ip route | column -t | awk '{print $5}' | head -n1) -m | grep -v "eth\|month\|estimated\|-" | sed 's/KiB/KB/g' | sed 's/MiB/MB/g' | sed 's/GiB/GB/g' | sed 's/TiB/TB/g' | sed 's/\//./g' | awk 'NR>2 {print "{\"date\":\""$1,$2"\",\"rx\":\""$3,$4"\",\"tx\":\""$6,$7"\"}"}' | tr "\n" ",") - echo "{\"cpu\":{$cpuinfo\"cores\":{$cpuperc},$cputemp},\"ram\":{$memtype\"total\":\"$memtotal\",\"free\":\"$memfree\"},\"hdds\":[$hdds],\"ipv4\":{$ipv4},\"traffic\":{\"daily\":[$trafficdays],\"monthly\":[$trafficmonths]},\"rootpw\":\"$(checkpasswd $VAR_C)\"}" | sed 's/,}/}/g' | sed 's/,]/]/g' -fi + cpuinfo=$(dmidecode --type processor 2>/dev/null | grep -i "Version:\|Max Speed:" | + sed -e 's/Version: /"name":"/g' -e 's/Max Speed: /"speed":"/g' | sed -E 's/^[ \t]*//' | + sed 's/[[:space:]]\+/ /g' | sed 's/$/"/g' | tr "\n" "," | sed 's/ "/"/g') + [ -z "$cpuinfo" ] && cpuinfo=$(grep -m 1 -i "model name" /proc/cpuinfo | sed -e 's/model name/"name":"/g' -e 's/^[ \t]*//' -e 's/$/"/g' | tr "\n" ",") + + cputemp=$(sensors 2>/dev/null | grep -i "temp1:" | awk '{print "\"temp\":\""$2"\",\"critic\":\""$5"\""}' | sed 's/[+°C)]//g' | uniq) + + ipv4=$(ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v "^127" | awk '{print "\""NR"\":\""$1"\""}' | tr "\n" ",") + + iface=$(ip route | awk '/default/ {print $5}' | head -n1) + trafficdays=$(vnstat -i "$iface" -d | grep -vE "eth|day|estimated|-" | + sed -E 's/(KiB|MiB|GiB|TiB)/\U&/g;s/\//./g' | + awk 'NR>2 {print "{\"date\":\""$1"\",\"rx\":\""$2,$3"\",\"tx\":\""$5,$6"\"}"}' | tr "\n" ",") + + trafficmonths=$(vnstat -i "$iface" -m | grep -vE "eth|month|estimated|-" | + sed -E 's/(KiB|MiB|GiB|TiB)/\U&/g;s/\//./g' | + awk 'NR>2 {print "{\"date\":\""$1,$2"\",\"rx\":\""$3,$4"\",\"tx\":\""$6,$7"\"}"}' | tr "\n" ",") + + echo "{\"cpu\":{$cpuinfo\"cores\":{$cpuperc},$cputemp},\"ram\":{$memtype\"total\":\"$memtotal\",\"free\":\"$memfree\"},\"hdds\":[$hdds],\"ipv4\":{$ipv4},\"traffic\":{\"daily\":[$trafficdays],\"monthly\":[$trafficmonths]},\"rootpw\":\"$(checkpasswd "$VAR_C")\"}" | + sed -E 's/,}/}/g;s/,]/]/g' +fi -exit 0 +exit 0 \ No newline at end of file diff --git a/hlstats.sh b/hlstats.sh index 6328c7f..2d68bb5 100755 --- a/hlstats.sh +++ b/hlstats.sh @@ -1,133 +1,158 @@ -#! /bin/bash +#!/bin/bash -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net +# TekLabs TekBase - HLStats Control Script (Screen + Docker) +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi +VAR_A="$1" +VAR_B="$2" # User OR docker container name with prefix +VAR_C="$3" # Port / Screen name +VAR_D="$4" # Port +VAR_E="$5" # Admin password (or other) +# Unified logging +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) +LOGFILE="$LOGP/logs/$LOGF.txt" +mkdir -p "$LOGP/logs" +chmod 0777 "$LOGP/logs" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" + +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +is_docker() { + [[ "$VAR_B" == docker-* ]] +} +get_container_name() { + echo "${VAR_B#docker-}" +} + +# Load credentials and paths mysqlpwd=$(grep -i password hlstats.ini | awk '{print $2}') mysqlusr=$(grep -i login hlstats.ini | awk '{print $2}') wwwpath=$(grep -i www hlstats.ini | awk '{print $2}') -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +[ -z "$VAR_A" ] && ./tekbase && exit 0 case "$VAR_A" in - # HlStats installieren - 1) - if [ -d /home/$VAR_B ] ; then - cd /home - rm -r $VAR_B + 1) # INSTALL + if is_docker; then + container_name=$(get_container_name) + docker run -d --name "$container_name" \ + -p "$VAR_D:$VAR_D" \ + -v "/home/skripte/hlstats:/hlstats" \ + teklab/hlstats + log_msg "Docker HLStats container $container_name created and running" + echo "ID1" + exit 0 fi - cd /home - mkdir $VAR_B - cd /home/skripte/hlstats - cp -r * /home/$VAR_B - cd /home/$VAR_B/sql - - Q1="CREATE DATABASE IF NOT EXISTS $VAR_B;" - Q2="GRANT ALL PRIVILEGES ON $VAR_B.* TO '$VAR_B'@'localhost' IDENTIFIED BY '$VAR_C' WITH GRANT OPTION;" - Q3="FLUSH PRIVILEGES;" - SQL="${Q1}${Q2}${Q3}" - - mysql --user=$mysqlusr --password=$mysqlpwd -e "$SQL" - mysql --user=$VAR_B --password=$VAR_C $VAR_B < install.sql - mysql --user=$VAR_B --password=$VAR_C $VAR_B -e "UPDATE hlstats_Users SET password='$VAR_E' WHERE username='admin' OR acclevel='100'" - - cd .. - cd scripts - - sed -e '/DBUsername/Ic\DBUsername "'$VAR_B'"' hlstats.conf > backup.conf - sed -e '/DBPassword/Ic\DBPassword "'$VAR_C'"' backup.conf > hlstats.conf - sed -e '/DBName/Ic\DBName "'$VAR_B'"' hlstats.conf > backup.conf - sed -e '/Port/Ic\Port '$VAR_D'' backup.conf > hlstats.conf - - rm backup.conf - cd .. - echo "$VAR_C" > passwd.ini - cd web - rm -r updater - - sed -e '/define("DB_NAME/Ic\define("DB_NAME", "'$VAR_B'");' config.php > backup.php - sed -e '/define("DB_USER/Ic\define("DB_USER", "'$VAR_B'");' backup.php > config.php - sed -e '/define("DB_PASS/Ic\define("DB_PASS", "'$VAR_C'");' config.php > backup.php - - rm config.php - mv backup.php config.php - cd .. - cp -r web $wwwpath/$VAR_B - useradd -g users -p $(perl -e 'print crypt("'$VAR_C'","Sa")') -s /bin/bash -m $VAR_B -d /var/www/$VAR_B - chown -R $VAR_B:users /var/www/$VAR_B - cd /home/$VAR_B/scripts - ./run_hlstats start 1 $VAR_D & - echo "ID1" - ;; - # HlStats restarten - 2) - cd /home/$VAR_B/scripts - ./run_hlstats stop $VAR_C & - rm -r logs - ./run_hlstats start 1 $VAR_C & + + [ -d "/home/$VAR_B" ] && rm -rf "/home/$VAR_B" + mkdir "/home/$VAR_B" + cp -r /home/skripte/hlstats/* "/home/$VAR_B" + + cd "/home/$VAR_B/sql" || exit 1 + SQL="CREATE DATABASE IF NOT EXISTS $VAR_B; + GRANT ALL PRIVILEGES ON $VAR_B.* TO '$VAR_B'@'localhost' IDENTIFIED BY '$VAR_C'; + FLUSH PRIVILEGES;" + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "$SQL" + mysql --user="$VAR_B" --password="$VAR_C" "$VAR_B" < install.sql + mysql --user="$VAR_B" --password="$VAR_C" "$VAR_B" -e \ + "UPDATE hlstats_Users SET password='$VAR_E' WHERE username='admin' OR acclevel='100'" + + cd ../scripts || exit 1 + sed -e "/DBUsername/Ic\DBUsername \"$VAR_B\"" hlstats.conf > conf1 + sed -e "/DBPassword/Ic\DBPassword \"$VAR_C\"" conf1 > conf2 + sed -e "/DBName/Ic\DBName \"$VAR_B\"" conf2 > conf3 + sed -e "/Port/Ic\Port $VAR_D" conf3 > hlstats.conf + rm -f conf1 conf2 conf3 + + echo "$VAR_C" > ../passwd.ini + cd ../web || exit 1 + rm -rf updater + sed -e "/define(\"DB_NAME/Ic\define(\"DB_NAME\", \"$VAR_B\");" config.php > temp1 + sed -e "/define(\"DB_USER/Ic\define(\"DB_USER\", \"$VAR_B\");" temp1 > temp2 + sed -e "/define(\"DB_PASS/Ic\define(\"DB_PASS\", \"$VAR_C\");" temp2 > config.php + rm -f temp1 temp2 + + cp -r web "$wwwpath/$VAR_B" + useradd -g users -p "$(perl -e 'print crypt("'"$VAR_C"'","Sa")')" -s /bin/bash -m "$VAR_B" -d "/var/www/$VAR_B" + chown -R "$VAR_B:users" "/var/www/$VAR_B" + + cd "/home/$VAR_B/scripts" || exit 1 + ./run_hlstats start 1 "$VAR_D" & + log_msg "Native HLStats installed and started for user $VAR_B on port $VAR_D" echo "ID1" - ;; - # HlStats stoppen - 3) - cd /home/$VAR_B/scripts - ./run_hlstats stop $VAR_C & + ;; + + 2) # RESTART + if is_docker; then + docker restart "$(get_container_name)" + echo "ID1" + else + cd "/home/$VAR_B/scripts" || exit 1 + ./run_hlstats stop "$VAR_C" & + rm -rf logs + ./run_hlstats start 1 "$VAR_C" & + log_msg "HLStats restarted for user $VAR_B" + echo "ID1" + fi + ;; + + 3) # STOP + if is_docker; then + docker stop "$(get_container_name)" + log_msg "HLStats docker container $(get_container_name) stopped" + else + cd "/home/$VAR_B/scripts" || exit 1 + ./run_hlstats stop "$VAR_C" & + log_msg "HLStats stopped for user $VAR_B" + fi echo "ID1" - ;; - # FTP Passwort - 4) - usermod -p $(perl -e 'print crypt("'$VAR_C'","Sa")') $VAR_B + ;; + + 4) # CHANGE FTP PASSWORD + usermod -p "$(perl -e 'print crypt("'"$VAR_C"'","Sa")')" "$VAR_B" + log_msg "FTP password updated for $VAR_B" echo "ID1" - ;; - # Admin Passwort - 5) - passwd=$(cat /home/$VAR_B/passwd.ini) - mysql --user=$VAR_B --password=$passwd $VAR_B -e "UPDATE hlstats_Users SET password='$VAR_C' WHERE username='admin' OR acclevel='100'" + ;; + + 5) # CHANGE HLSTATS ADMIN PASSWORD + passwd=$(cat "/home/$VAR_B/passwd.ini") + mysql --user="$VAR_B" --password="$passwd" "$VAR_B" -e \ + "UPDATE hlstats_Users SET password='$VAR_C' WHERE username='admin' OR acclevel='100'" + log_msg "HLStats admin password changed for $VAR_B" echo "ID1" - ;; - # HlStats löschen - 6) - cd /home/$VAR_B/scripts - ./run_hlstats stop $VAR_C & - - mysql --user=$mysqlusr --password=$mysqlpwd -e "DROP USER $VAR_B@localhost;" - mysql --user=$mysqlusr --password=$mysqlpwd -e "DROP DATABASE $VAR_B;" - - cd $wwwpath - rm -r $VAR_B - cd /home - rm -r $VAR_B + ;; + + 6) # DELETE HLSTATS + if is_docker; then + docker stop "$(get_container_name)" + docker rm "$(get_container_name)" + log_msg "HLStats docker container $(get_container_name) deleted" + else + cd "/home/$VAR_B/scripts" || exit 1 + ./run_hlstats stop "$VAR_C" & + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "DROP USER '$VAR_B'@'localhost';" + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "DROP DATABASE $VAR_B;" + rm -rf "$wwwpath/$VAR_B" "/home/$VAR_B" + log_msg "HLStats native installation for $VAR_B deleted" + fi echo "ID1" - # Awards - ;; - 7) - filelist=$(find /home -maxdepth 1 -type d -printf "%f\n") - for LINE in $filelist - do - if echo "$LINE" | grep -i "hls_" > /dev/null 2>&1 ; then - cd /home/$LINE/scripts - ./hlstats-awards.pl - fi + ;; + + 7) # RUN HLSTATS AWARDS + for LINE in $(find /home -maxdepth 1 -type d -printf "%f\n"); do + if echo "$LINE" | grep -iq "^hls_"; then + cd "/home/$LINE/scripts" && ./hlstats-awards.pl + fi done - ;; + log_msg "HLStats awards run on all matching folders" + ;; esac -exit 0 +exit 0 \ No newline at end of file diff --git a/openvz.sh b/openvz.sh index 023758a..805d1f3 100755 --- a/openvz.sh +++ b/openvz.sh @@ -1,539 +1,425 @@ -#! /bin/bash - -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net - -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 -VAR_H=$8 -VAR_I=$9 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi - +#!/bin/bash + +# TekLabs TekBase - Modernized OpenVZ Management Script +# Maintainer: Christian Frankenstein +# Updated: 2025-04-16 +# Features: +# - Centralized logging +# - Safe vzctl/vzdump operations +# - Structured command routines +# - Screen-based process handling +# - OpenVZ only (no Docker/symlink) + +# Parameters +VAR_A="$1" # Action +VAR_B="$2" # VE ID (CTID) +VAR_C="$3" # Template / Filename / Maxfiles / New rootpw +VAR_D="$4" # (Optional) Unused / Template +VAR_E="$5" +VAR_F="$6" +VAR_G="$7" +VAR_H="$8" +VAR_I="$9" + +# Paths and Logging Setup +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") +LOGFILE="$LOGP/logs/$LOGF.txt" LOGC=$(date +"%Y_%m-%H_%M_%S") -LOGP=$(pwd) - -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi - -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi - -if [ -f settings.ini ]; then - vzconf=$(grep -i vzconf settings.ini | awk '{print $2}') - if [ ! -n "$vzconf" ]; then - vzconf="vz/conf" - fi -fi - +mkdir -p "$LOGP/logs" "$LOGP/restart" "$LOGP/cache" +chmod -R 0777 "$LOGP/logs" "$LOGP/restart" "$LOGP/cache" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" + +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +# Default vzconf path (if settings.ini is missing) +if [ -f "$LOGP/settings.ini" ]; then + vzconf=$(grep -i vzconf "$LOGP/settings.ini" | awk '{print $2}') + [ -z "$vzconf" ] && vzconf="vz/conf" +else + vzconf="vz/conf" +fi +# ---------------------------- +# INSTALL +# ---------------------------- if [ "$VAR_A" = "install" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver installrun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - fi - if [ ! -n "$check" ]; then - runcheck=$(vzctl status $VAR_B | grep -i running) - if [ -n "$runcheck" ]; then - echo "ID3" - else - echo "ID2" - fi + screenname="vinstall$VAR_B-X" + startchk=$(pgrep -f "screen.*$screenname") + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" installrun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" + sleep 1 + check=$(pgrep -f "screen.*$screenname") + if [ -z "$check" ]; then + runcheck=$(vzctl status "$VAR_B" | grep -i running) + [ -n "$runcheck" ] && echo "ID3" || echo "ID2" + else + echo "ID1" + fi else - echo "ID1" + echo "ID1" fi fi +# ---------------------------- +# INSTALLRUN +# ---------------------------- if [ "$VAR_A" = "installrun" ]; then + TEMPLATE="$VAR_C" + IMAGE_URL="$VAR_G" + CACHE_DIR="/vz/template/cache" + IMAGE="$CACHE_DIR/$TEMPLATE.tar.gz" + if [ "$VAR_E" = "delete" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - vzctl stop $VAR_B - if [ -f "/var/lib/vz/root/$VAR_B" ]; then - umount -l "/var/lib/vz/root/$VAR_B" - fi - fi - sleep 5 - vzctl destroy $VAR_B - sleep 10 - if [ ! -f /etc/$vzconf/$VAR_B.conf ]; then - echo "$(date) - VServer $VAR_B was deleted" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B cant be deleted" >> $LOGP/logs/$LOGF.txt - fi - cd /etc/$vzconf - rm $VAR_B.conf.destroyed - fi - if [ ! -f /etc/$vzconf/$VAR_B.conf ]; then - cd /vz/template/cache - if [ ! -f $VAR_C.tar.gz ]; then - mkdir $LOGC - cd $LOGC - wget $VAR_G/$VAR_C.tar.gz - mv $VAR_C.tar.gz /vz/template/cache/$VAR_C.tar.gz - cd .. - rm -r $LOGC - else - if [ -f $VAR_B$VAR_C.md5 ]; then - rm $VAR_B$VAR_C.md5 - fi - wget -O $VAR_B$VAR_C.md5 $VAR_G/$VAR_C.tar.gz.md5 - if [ -f $VAR_B$VAR_C.md5 ]; then - dowmd5=$(cat $VAR_B$VAR_C.md5 | awk '{print $1}') - rm $VAR_B$VAR_C.md5 - else - dowmd5="ID2" - fi - chkmd5=$(md5sum $VAR_C.tar.gz | awk '{print $1}') - if [ "$dowmd5" != "$chkmd5" ]; then - mkdir $LOGC - cd $LOGC - wget $VAR_G/$VAR_C.tar.gz - dowmd5=$(md5sum $VAR_C.tar.gz | awk '{print $1}') - if [ "$dowmd5" != "$chkmd5" ]; then - mv $VAR_C.tar.gz /vz/template/cache/$VAR_C.tar.gz - fi - cd .. - rm -r $LOGC - fi - fi - if [ ! -f $VAR_C.tar.gz ]; then - echo "$(date) - Image $VAR_C.tar.gz cant be downloaded" >> $LOGP/logs/$LOGF.txt + vzctl stop "$VAR_B" + umount -l "/var/lib/vz/root/$VAR_B" 2>/dev/null + sleep 5 + vzctl destroy "$VAR_B" + sleep 10 + if [ ! -f "/etc/$vzconf/$VAR_B.conf" ]; then + log_msg "VServer $VAR_B was deleted" else - echo "$(date) - Image $VAR_C.tar.gz was downloaded" >> $LOGP/logs/$LOGF.txt - fi - vzctl create $VAR_B --ostemplate $VAR_C - if [ ! -f /etc/$vzconf/$VAR_B.conf ]; then - echo "$(date) - VServer $VAR_B cant be created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B was created" >> $LOGP/logs/$LOGF.txt - VAR_A="changerun" - VAR_E="install" + log_msg "VServer $VAR_B could not be deleted" fi - else - echo "$(date) - VServer $VAR_B cant be created" >> $LOGP/logs/$LOGF.txt + cd "/etc/$vzconf" + rm -f "$VAR_B.conf.destroyed" + exit 0 fi -fi -if [ "$VAR_A" = "statuscheck" ]; then - checka=$(ps aux | grep -v grep | grep -i vbackup$VAR_B-X) - checkb=$(ps aux | grep -v grep | grep -i vrestore$VAR_B-X) - if [ ! -n "$checka" ] && [ ! -n "$checkb" ]; then - echo "ID1" - else - echo "ID2" - fi -fi + mkdir -p "$CACHE_DIR" + cd "$CACHE_DIR" -if [ "$VAR_A" = "delete" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver deleterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - fi - if [ ! -n "$check" ]; then - if [ -f /etc/$vzconf/$VAR_B.conf ]; then - echo "ID3" - else - echo "ID2" - fi + # Download if missing + if [ ! -f "$TEMPLATE.tar.gz" ]; then + mkdir "$LOGC" && cd "$LOGC" + wget "$IMAGE_URL/$TEMPLATE.tar.gz" -O "$TEMPLATE.tar.gz" + mv "$TEMPLATE.tar.gz" "$CACHE_DIR/" + cd .. && rm -rf "$LOGC" else - echo "ID1" - fi -fi - -if [ "$VAR_A" = "deleterun" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - vzctl stop $VAR_B - if [ -f "/var/lib/vz/root/$VAR_B" ]; then - umount -l "/var/lib/vz/root/$VAR_B" + wget -q -O "$VAR_B$TEMPLATE.md5" "$IMAGE_URL/$TEMPLATE.tar.gz.md5" + [ -f "$VAR_B$TEMPLATE.md5" ] && remote_md5=$(cut -d ' ' -f1 "$VAR_B$TEMPLATE.md5") && rm -f "$VAR_B$TEMPLATE.md5" + local_md5=$(md5sum "$TEMPLATE.tar.gz" | cut -d ' ' -f1) + if [ "$remote_md5" != "$local_md5" ]; then + mkdir "$LOGC" && cd "$LOGC" + wget "$IMAGE_URL/$TEMPLATE.tar.gz" -O "$TEMPLATE.tar.gz" + mv "$TEMPLATE.tar.gz" "$CACHE_DIR/" + cd .. && rm -rf "$LOGC" fi fi - sleep 5 - vzctl destroy $VAR_B - sleep 10 - if [ ! -f /etc/$vzconf/$VAR_B.conf ]; then - echo "$(date) - VServer $VAR_B was deleted" >> $LOGP/logs/$LOGF.txt + + [ -f "$TEMPLATE.tar.gz" ] && log_msg "Image $TEMPLATE.tar.gz downloaded" || log_msg "Image $TEMPLATE.tar.gz could not be downloaded" + + # Create the container + vzctl create "$VAR_B" --ostemplate "$TEMPLATE" + if [ -f "/etc/$vzconf/$VAR_B.conf" ]; then + log_msg "VServer $VAR_B was created" + "$0" changerun "$VAR_B" "$VAR_C" "$VAR_D" "install" else - echo "$(date) - VServer $VAR_B cant be deleted" >> $LOGP/logs/$LOGF.txt - fi - cd /etc/$vzconf - rm $VAR_B.conf.destroyed - if [ -d /usr/vz/$VAR_B ]; then - cd /usr/vz - rm -r $VAR_B + log_msg "VServer $VAR_B could not be created" fi fi - - +# ---------------------------- +# START VSERVER +# ---------------------------- if [ "$VAR_A" = "start" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver startrun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - fi - if [ ! -n "$check" ]; then - vzctl status $VAR_B | grep -i running - if [ -n "$runcheck" ]; then - echo "ID3" - else - echo "ID2" - fi + screenname="vstart$VAR_B-X" + startchk=$(pgrep -f "screen.*$screenname") + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" startrun "$VAR_B" + sleep 1 + check=$(pgrep -f "screen.*$screenname") + if [ -z "$check" ]; then + runcheck=$(vzctl status "$VAR_B" | grep -i running) + [ -n "$runcheck" ] && echo "ID3" || echo "ID2" + else + echo "ID1" + fi else - echo "ID1" + echo "ID1" fi fi if [ "$VAR_A" = "startrun" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - vzctl stop $VAR_B - if [ -f "/var/lib/vz/root/$VAR_B" ]; then - umount -l "/var/lib/vz/root/$VAR_B" - fi - fi - sleep 2 - vzctl start $VAR_B - runcheck=$(vzctl status $VAR_B | grep -i running) - if [ ! -n "$runcheck" ]; then - echo "$(date) - VServer $VAR_B cant be started" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B was started" >> $LOGP/logs/$LOGF.txt - fi - fi + vzctl stop "$VAR_B" 2>/dev/null + umount -l "/var/lib/vz/root/$VAR_B" 2>/dev/null + sleep 2 + vzctl start "$VAR_B" + runcheck=$(vzctl status "$VAR_B" | grep -i running) + [ -n "$runcheck" ] && log_msg "VServer $VAR_B started" || log_msg "VServer $VAR_B could not be started" +fi +# ---------------------------- +# STOP VSERVER +# ---------------------------- if [ "$VAR_A" = "stop" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver stoprun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - fi - if [ ! -n "$check" ]; then - runcheck=$(vzctl status $VAR_B | grep -i running) - if [ ! -n "$runcheck" ]; then - echo "ID3" - else - echo "ID2" - fi + screenname="vstop$VAR_B-X" + startchk=$(pgrep -f "screen.*$screenname") + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" stoprun "$VAR_B" + sleep 1 + check=$(pgrep -f "screen.*$screenname") + if [ -z "$check" ]; then + runcheck=$(vzctl status "$VAR_B" | grep -i running) + [ -z "$runcheck" ] && echo "ID3" || echo "ID2" + else + echo "ID1" + fi else - echo "ID1" + echo "ID1" fi fi if [ "$VAR_A" = "stoprun" ]; then - vzctl stop $VAR_B - if [ -f "/var/lib/vz/root/$VAR_B" ]; then - umount -l "/var/lib/vz/root/$VAR_B" - fi + vzctl stop "$VAR_B" + umount -l "/var/lib/vz/root/$VAR_B" 2>/dev/null sleep 2 - check=$(vzctl status $VAR_B | grep -i running) - if [ ! -n "$check" ]; then - echo "$(date) - VServer $VAR_B was stopped" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B cant be stopped" >> $LOGP/logs/$LOGF.txt - fi -fi - -if [ "$VAR_A" = "info" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - memall=$(vzctl exec $VAR_B free | tail -n 2 | head -1 | awk '{print $2}') - memused=$(vzctl exec $VAR_B free | tail -n 2 | head -1 | awk '{print $3}') - hddused=$(vzlist -o diskspace,diskspace.h $VAR_B | tail -1l | awk '{print $1,$2}') - runtime=$(vzctl exec $VAR_B uptime | awk '{print $3,$4}') - echo "$memall $memused%TD%$hddused%TD%$runtime" - fi + check=$(vzctl status "$VAR_B" | grep -i running) + [ -z "$check" ] && log_msg "VServer $VAR_B stopped" || log_msg "VServer $VAR_B could not be stopped" fi -if [ "$VAR_A" = "list" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - vzctl exec $VAR_B ls -l /etc/init.d | awk '{print $1"%TD%"$NF"%TEND%"}' - fi -fi - -if [ "$VAR_A" = "process" ]; then - vzctl exec $VAR_B kill -9 $VAR_C - check=$(vzctl exec $VAR_B ps -p $VAR_C | grep -v "PID TTY") - if [ ! -n "$check" ]; then - echo "$(date) - VServer $VAR_B process $VAR_C was killed" >> $LOGF/logs/$LOGF.txt - echo "ID1" +# ---------------------------- +# DELETE VSERVER +# ---------------------------- +if [ "$VAR_A" = "delete" ]; then + screenname="vdelete$VAR_B-X" + startchk=$(pgrep -f "screen.*$screenname") + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" deleterun "$VAR_B" + sleep 1 + check=$(pgrep -f "screen.*$screenname") + if [ -z "$check" ]; then + [ -f "/etc/$vzconf/$VAR_B.conf" ] && echo "ID3" || echo "ID2" + else + echo "ID1" + fi else - echo "$(date) - VServer $VAR_B process $VAR_C cant be killed" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi -fi - -if [ "$VAR_A" = "psaux" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - vzctl exec $VAR_B ps aux --sort pid | grep -v "ps aux" | grep -v "awk {printf" | grep -v "tekbase" | grep -v "perl -e use MIME::Base64" | awk '{printf($1"%TD%") - printf($2"%TD%") - printf($3"%TD%") - printf($4"%TD%") - for (i=11;i<=NF;i++) { - printf("%s ", $i); - } - print("%TEND%")}' + echo "ID1" fi fi -if [ "$VAR_A" = "service" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - runcheck=$(vzctl exec $VAR_B find /etc/init.d/$VAR_C) - if [ -n "$runcheck" ]; then - vzctl exec $VAR_B /etc/init.d/$VAR_C $VAR_D - echo "ID1" - fi - fi -fi - -if [ "$VAR_A" = "backuplist" ]; then - if [ -d /usr/vz/$VAR_B ]; then - cd /usr/vz/$VAR_B - check=$(find -name "*.tgz" -o -name "*.lzo" -type f) - output="" - for LINE in $check - do - output=$(echo "$output$LINE%TEND%") - done +if [ "$VAR_A" = "deleterun" ]; then + vzctl stop "$VAR_B" 2>/dev/null + umount -l "/var/lib/vz/root/$VAR_B" 2>/dev/null + sleep 5 + vzctl destroy "$VAR_B" + sleep 5 + if [ ! -f "/etc/$vzconf/$VAR_B.conf" ]; then + log_msg "VServer $VAR_B deleted" + else + log_msg "VServer $VAR_B could not be deleted" fi - echo "$output" + [ -d "/usr/vz/$VAR_B" ] && rm -rf "/usr/vz/$VAR_B" fi - +# ---------------------------- +# BACKUP VSERVER +# ---------------------------- if [ "$VAR_A" = "backup" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver backuprun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - fi - if [ ! -n "$check" ]; then - runcheck=$(vzctl status $VAR_B | grep -i running) - if [ -n "$runcheck" ]; then - echo "ID3" - else - echo "ID2" - fi + screenname="vbackup$VAR_B-X" + startchk=$(pgrep -f "screen.*$screenname") + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" backuprun "$VAR_B" "$VAR_C" + sleep 1 + check=$(pgrep -f "screen.*$screenname") + if [ -z "$check" ]; then + runcheck=$(vzctl status "$VAR_B" | grep -i running) + [ -n "$runcheck" ] && echo "ID3" || echo "ID2" + else + echo "ID1" + fi else - echo "ID1" + echo "ID1" fi fi if [ "$VAR_A" = "backuprun" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ ! -n "$check" ]; then - vzctl start $VAR_B - fi - mkdir -p /usr/vz - mkdir -p /usr/vz/$VAR_B - vzdump --compress gzip --maxfiles $VAR_C --bwlimit 30720 --dumpdir /usr/vz/$VAR_B $VAR_B - cd /usr/vz/$VAR_B + [ -z "$(vzctl status "$VAR_B" | grep -i running)" ] && vzctl start "$VAR_B" + mkdir -p /usr/vz/"$VAR_B" + vzdump --compress gzip --maxfiles "$VAR_C" --bwlimit 30720 --dumpdir /usr/vz/"$VAR_B" "$VAR_B" + cd /usr/vz/"$VAR_B" checkfile=$(find vzdump*) if [ -n "$checkfile" ]; then - echo "$(date) - VServer $VAR_B backup was created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B backup cant be created" >> $LOGP/logs/$LOGF.txt - fi -fi - -if [ "$VAR_A" = "remove" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver removerun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - fi - if [ ! -n "$check" ]; then - if [ -f /usr/vz/$VAR_B/$VAR_C ]; then - echo "ID2" - else - echo "ID3" - fi + log_msg "VServer $VAR_B backup was created" else - echo "ID1" + log_msg "VServer $VAR_B backup could not be created" fi fi -if [ "$VAR_A" = "removerun" ]; then - sleep 2 - if [ -f /usr/vz/$VAR_B/$VAR_C ]; then - cd /usr/vz/$VAR_B - file=$(echo "$VAR_C" | awk --field-separator=. '{print $1}') - mv $VAR_C $file.old - rm $file.log - rm $file.old - echo "$(date) - VServer $VAR_B backup $VAR_C was deleted" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B backup $VAR_C cant be founded or was already deleted" >> $LOGP/logs/$LOGF.txt - fi -fi - +# ---------------------------- +# RESTORE VSERVER +# ---------------------------- if [ "$VAR_A" = "restore" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver restorerun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - fi - if [ ! -n "$check" ]; then - if [ -f /usr/vz/$VAR_B/$VAR_C ]; then - echo "ID2" - else - echo "ID3" - fi + screenname="vrestore$VAR_B-X" + startchk=$(pgrep -f "screen.*$screenname") + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" restorerun "$VAR_B" "$VAR_C" + sleep 1 + check=$(pgrep -f "screen.*$screenname") + if [ -z "$check" ]; then + [ -f /usr/vz/"$VAR_B"/"$VAR_C" ] && echo "ID2" || echo "ID3" + else + echo "ID1" + fi else - echo "ID1" + echo "ID1" fi fi if [ "$VAR_A" = "restorerun" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ ! -f /usr/vz/$VAR_B/$VAR_C ]; then - echo "$(date) - VServer $VAR_B backup $VAR_C cant be founded" >> $LOGP/logs/$LOGF.txt + BACKUP_PATH="/usr/vz/$VAR_B/$VAR_C" + if [ ! -f "$BACKUP_PATH" ]; then + log_msg "VServer $VAR_B backup $VAR_C could not be found" else - if [ -n "$check" ]; then - vzctl stop $VAR_B - if [ -f "/var/lib/vz/root/$VAR_B" ]; then - umount -l "/var/lib/vz/root/$VAR_B" - fi - sleep 5 - vzctl destroy $VAR_B - sleep 10 - fi - vzrestore /usr/vz/$VAR_B/$VAR_C $VAR_B - vzctl start $VAR_B - runcheck=$(vzctl status $VAR_B | grep -i running) - if [ ! -n "$runcheck" ]; then - echo "$(date) - VServer $VAR_B backup $VAR_C cant be restored" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B backup $VAR_C was restored" >> $LOGP/logs/$LOGF.txt - fi + vzctl stop "$VAR_B" 2>/dev/null + umount -l "/var/lib/vz/root/$VAR_B" 2>/dev/null + sleep 5 + vzctl destroy "$VAR_B" + sleep 10 + vzrestore "$BACKUP_PATH" "$VAR_B" + vzctl start "$VAR_B" + runcheck=$(vzctl status "$VAR_B" | grep -i running) + [ -n "$runcheck" ] && log_msg "VServer $VAR_B restored from $VAR_C" || log_msg "Restore of $VAR_B from $VAR_C failed" fi fi -if [ "$VAR_A" = "change" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver changerun "$VAR_B" "$VAR_C" "$VAR_D" +# ---------------------------- +# SERVICE CONTROL +# ---------------------------- +if [ "$VAR_A" = "service" ]; then + if vzctl status "$VAR_B" | grep -iq running; then + if vzctl exec "$VAR_B" [ -x /etc/init.d/"$VAR_C" ]; then + vzctl exec "$VAR_B" /etc/init.d/"$VAR_C" "$VAR_D" + echo "ID1" + fi fi - echo "ID1" fi +# ---------------------------- +# CONFIG CHANGE (Tun/Tap, IP, Settings) +# ---------------------------- if [ "$VAR_A" = "changerun" ]; then - if [ -f /etc/$vzconf/$VAR_B.conf ]; then + if [ -f /etc/"$vzconf"/"$VAR_B".conf ]; then if [ "$VAR_F" = "1" ]; then - vzctl set $VAR_B --devnodes net/tun:rw --save - vzctl set $VAR_B --devices c:10:200:rw --save - vzctl set $VAR_B --capability net_admin:on --save - vzctl exec $VAR_B mkdir -p /dev/net - vzctl exec $VAR_B mknod /dev/net/tun c 10 200 - vzctl exec $VAR_B chmod 600 /dev/net/tun - echo "$(date) - VServer $VAR_B Tun & Tap was activated" >> $LOGP/logs/$LOGF.txt + vzctl set "$VAR_B" --devnodes net/tun:rw --save + vzctl set "$VAR_B" --devices c:10:200:rw --save + vzctl set "$VAR_B" --capability net_admin:on --save + vzctl exec "$VAR_B" mkdir -p /dev/net + vzctl exec "$VAR_B" mknod /dev/net/tun c 10 200 + vzctl exec "$VAR_B" chmod 600 /dev/net/tun + log_msg "VServer $VAR_B Tun & Tap activated" else - echo "$(date) - VServer $VAR_B Tun & Tap was not activated" >> $LOGP/logs/$LOGF.txt + log_msg "VServer $VAR_B Tun & Tap not activated" fi - if [ -f $LOGP/cache/vsettings_$VAR_B.lst ]; then - while read LINE - do - if [ "$LINE" != "" ]; then - vzctl set $VAR_B $LINE --save - fi - done < $LOGP/cache/vsettings_$VAR_B.lst - rm $LOGP/cache/vsettings_$VAR_B.lst - fi - echo "$(date) - VServer $VAR_B config was changed" >> $LOGP/logs/$LOGF.txt + + [ -f "$LOGP/cache/vsettings_${VAR_B}.lst" ] && while read -r LINE; do + [ -n "$LINE" ] && vzctl set "$VAR_B" $LINE --save + done < "$LOGP/cache/vsettings_${VAR_B}.lst" && rm -f "$LOGP/cache/vsettings_${VAR_B}.lst" + + log_msg "VServer $VAR_B settings applied" else - echo "$(date) - VServer $VAR_B config cant be changed" >> $LOGP/logs/$LOGF.txt + log_msg "VServer $VAR_B config not found" fi - VAR_A="ipadd" fi - +# ---------------------------- +# IP ADDITION +# ---------------------------- if [ "$VAR_A" = "ipadd" ]; then - if [ -f /etc/$vzconf/$VAR_B.conf ]; then - if [ -f $LOGP/cache/vipadd_$VAR_B.lst ]; then - while read LINE - do - if [ "$LINE" != "" ]; then - vzctl set $VAR_B --ipadd $LINE --save - fi - done < $LOGP/cache/vipadd_$VAR_B.lst - rm $LOGP/cache/vipadd_$VAR_B.lst - fi - echo "$(date) - VServer $VAR_B new IP was added" >> $LOGP/logs/$LOGF.txt + if [ -f /etc/"$vzconf"/"$VAR_B".conf ]; then + if [ -f "$LOGP/cache/vipadd_${VAR_B}.lst" ]; then + while read -r LINE; do + [ -n "$LINE" ] && vzctl set "$VAR_B" --ipadd "$LINE" --save + done < "$LOGP/cache/vipadd_${VAR_B}.lst" + rm "$LOGP/cache/vipadd_${VAR_B}.lst" + fi + log_msg "VServer $VAR_B IPs added" else - echo "$(date) - VServer $VAR_B new IP cant be added" >> $LOGP/logs/$LOGF.txt + log_msg "IP add failed: config not found for $VAR_B" fi - VAR_A="ipdel" fi +# ---------------------------- +# IP REMOVAL +# ---------------------------- if [ "$VAR_A" = "ipdel" ]; then - if [ -f /etc/$vzconf/$VAR_B.conf ]; then - if [ -f $LOGP/cache/vipdel_$VAR_B.lst ]; then - while read LINE - do - if [ "$LINE" != "" ]; then - vzctl set $VAR_B --ipdel $LINE --save - fi - done < $LOGP/cache/vipdel_$VAR_B.lst - rm $LOGP/cache/vipdel_$VAR_B.lst - fi - echo "$(date) - VServer $VAR_B IP was removed" >> $LOGP/logs/$LOGF.txt + if [ -f /etc/"$vzconf"/"$VAR_B".conf ]; then + if [ -f "$LOGP/cache/vipdel_${VAR_B}.lst" ]; then + while read -r LINE; do + [ -n "$LINE" ] && vzctl set "$VAR_B" --ipdel "$LINE" --save + done < "$LOGP/cache/vipdel_${VAR_B}.lst" + rm "$LOGP/cache/vipdel_${VAR_B}.lst" + fi + log_msg "VServer $VAR_B IPs removed" else - echo "$(date) - VServer $VAR_B IP cant be removed" >> $LOGP/logs/$LOGF.txt + log_msg "IP removal failed: config not found for $VAR_B" fi - if [ "$VAR_E" = "install" ]; then - VAR_A="rootpw" - VAR_C=$VAR_D +fi + +# ---------------------------- +# STORE SETTINGS FOR LATER +# ---------------------------- +if [ "$VAR_A" = "settings" ]; then + echo "$VAR_C" > "$LOGP/cache/vsettings_${VAR_B}.lst" + [ -n "$VAR_D" ] && echo "$VAR_D" > "$LOGP/cache/vipadd_${VAR_B}.lst" + [ -n "$VAR_E" ] && echo "$VAR_E" > "$LOGP/cache/vipdel_${VAR_B}.lst" +fi + +# ---------------------------- +# CHANGE ROOT PASSWORD +# ---------------------------- +if [ "$VAR_A" = "rootpw" ]; then + if ! vzctl status "$VAR_B" | grep -iq running; then + vzctl start "$VAR_B" fi + vzctl set "$VAR_B" --userpasswd root:"$VAR_C" + echo "ID1" fi +# ---------------------------- +# VSERVER ONLINE STATUS +# ---------------------------- if [ "$VAR_A" = "online" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ -n "$check" ]; then - echo "ID1" - else - echo "ID2" - fi + vzctl status "$VAR_B" | grep -iq running && echo "ID1" || echo "ID2" fi -if [ "$VAR_A" = "settings" ]; then - echo "$VAR_C" > $LOGP/cache/vsettings_$VAR_B.lst - if [ "$VAR_D" != "" ]; then - echo "$VAR_D" > $LOGP/cache/vipadd_$VAR_B.lst - fi - if [ "$VAR_E" != "" ]; then - echo "$VAR_E" > $LOGP/cache/vipdel_$VAR_B.lst +# ---------------------------- +# LIST SERVICES +# ---------------------------- +if [ "$VAR_A" = "list" ]; then + if vzctl status "$VAR_B" | grep -iq running; then + vzctl exec "$VAR_B" ls -l /etc/init.d | awk '{print $1"%TD%"$NF"%TEND%"}' fi fi -if [ "$VAR_A" = "rootpw" ]; then - check=$(vzctl status $VAR_B | grep -i running) - if [ ! -n "$check" ]; then - vzctl start $VAR_B +# ---------------------------- +# LIST PROCESSES +# ---------------------------- +if [ "$VAR_A" = "psaux" ]; then + if vzctl status "$VAR_B" | grep -iq running; then + vzctl exec "$VAR_B" ps aux --sort pid | grep -vE "ps aux|awk|tekbase|perl" | awk '{ + printf($1"%TD%"$2"%TD%"$3"%TD%"$4"%TD%") + for(i=11;i<=NF;i++) printf("%s ", $i) + print "%TEND%" + }' fi - vzctl set $VAR_B --userpasswd root:$VAR_C - echo "ID1" fi - -exit 0 +# ---------------------------- +# KILL SPECIFIC PROCESS +# ---------------------------- +if [ "$VAR_A" = "process" ]; then + vzctl exec "$VAR_B" kill -9 "$VAR_C" + check=$(vzctl exec "$VAR_B" ps -p "$VAR_C" | grep -v "PID TTY") + if [ -z "$check" ]; then + log_msg "VServer $VAR_B process $VAR_C was killed" + echo "ID1" + else + log_msg "VServer $VAR_B process $VAR_C could not be killed" + echo "ID2" + fi +fi +# ---------------------------- +# CLEAN EXIT +# ---------------------------- +exit 0 \ No newline at end of file diff --git a/proxmox.sh b/proxmox.sh index 1ba6477..e0109e4 100755 --- a/proxmox.sh +++ b/proxmox.sh @@ -1,202 +1,168 @@ -#! /bin/bash - -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net - -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 -VAR_H=$8 -VAR_I=$9 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi - +#!/bin/bash + +# TekLabs TekBase - Proxmox VM Management Script (KVM/LXC) +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net + +VAR_A="$1" # Action: install, delete, statuscheck, installrun, deleterun +VAR_B="$2" # VM ID +VAR_C="$3" # Type: kvm or lxc +VAR_D="$4" # Image name (without extension) +VAR_E="$5" # Install/Delete trigger +VAR_F="$6" # Config file path (for create) +VAR_G="$7" # Remote image URL +VAR_H="$8" # Reserved +VAR_I="$9" # Reserved + +# Logging setup +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") LOGC=$(date +"%Y_%m-%H_%M_%S") -LOGP=$(pwd) - -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi +LOGFILE="$LOGP/logs/$LOGF.txt" +mkdir -p "$LOGP/logs" +chmod 0777 "$LOGP/logs" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} -#PVEVERSION=$(pveversion | cut -d"/" -f2 | cut -d"." -f1) -if [ "$VAR_C" == "kvm" ]; then - pvefolder="/etc/pve/qemu-server" - pvetype="KVM" - pveimagefolder="/var/lib/vz/template/iso" - pveext="iso" -fi -if [ "$VAR_C" == "lxc" ]; then - pvefolder="/etc/pve/lxc" - pvetype="LXC" - pveimagefolder="/var/lib/vz/template/cache" - pveext="tar.gz" -fi +# Folder & Extension Setup +case "$VAR_C" in + kvm) + pvefolder="/etc/pve/qemu-server" + pveimagefolder="/var/lib/vz/template/iso" + pveext="iso" + ;; + lxc) + pvefolder="/etc/pve/lxc" + pveimagefolder="/var/lib/vz/template/cache" + pveext="tar.gz" + ;; + *) + log_msg "❌ Unknown VM type: $VAR_C" + exit 1 + ;; +esac +# Default to TekBase UI +[ -z "$VAR_A" ] && ./tekbase && exit 0 +# --- Install VM --- if [ "$VAR_A" = "install" ]; then - # VAR_B=ID, VAR_C=Type, VAR_D=Image, VAR_G=Imageserver - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i p$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./proxmox installrun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i p$VAR_A$VAR_B-X) + screen_name="v${VAR_A}${VAR_B}-X" + if ! pgrep -f "screen.*$screen_name" > /dev/null; then + screen -A -m -d -S "$screen_name" "$0" installrun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" fi - if [ ! -n "$check" ]; then - if [ "$VAR_C" == "kvm" ]; then - runcheck=$(qm status $VAR_B | grep -i "running") - fi - if [ "$VAR_C" == "lxc" ]; then - runcheck=$(pct list | grep -v "stopped" | grep -i $VAR_B | awk '{print $2}') - fi - if [ -n "$runcheck" ]; then - echo "ID3" + + sleep 2 + if ! pgrep -f "screen.*$screen_name" > /dev/null; then + if [ "$VAR_C" = "kvm" ]; then + qm status "$VAR_B" | grep -iq running && echo "ID3" || echo "ID2" else - echo "ID2" + pct list | grep -i "$VAR_B" | grep -vq stopped && echo "ID3" || echo "ID2" fi else echo "ID1" fi fi +# --- Run Install Process --- if [ "$VAR_A" = "installrun" ]; then if [ "$VAR_E" = "delete" ]; then - if [ "$VAR_C" == "kvm" ]; then - check=$(qm status $VAR_B | grep -v "running") - if [ -n "$check" ]; then - qm stop $VAR_B - fi + if [ "$VAR_C" = "kvm" ]; then + qm stop "$VAR_B" 2>/dev/null sleep 5 - qm destroy $VAR_B - fi - if [ "$VAR_C" == "lxc" ]; then - check=$(pct list | grep -i "stopped" | grep -i $VAR_B | awk '{print $2}') - if [ -n "$check" ]; then - pct stop $VAR_B - fi + qm destroy "$VAR_B" + else + pct stop "$VAR_B" 2>/dev/null sleep 5 - pct destroy $VAR_B - fi - sleep 10 - if [ ! -f $pvefolder/$VAR_B.conf ]; then - echo "$(date) - $pvetype VServer $VAR_B was deleted" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - $pvetype VServer $VAR_B cant be deleted" >> $LOGP/logs/$LOGF.txt - fi - cd $pvefolder - rm $VAR_B.conf.destroyed - fi - fi - - if [ ! -f $pvefolder/$VAR_B.conf ]; then - cd $pveimagefolder - if [ ! -f $VAR_D.$pveext ]; then - mkdir $LOGC - cd $LOGC - wget $VAR_G/$VAR_D.$pveext - mv $VAR_D.$pveext $pveimagefolder/$VAR_D.$pveext - cd .. - rm -r $LOGC - else - if [ -f $VAR_C-$VAR_D.md5 ]; then - rm $VAR_C-$VAR_D.md5 - fi - wget -O $VAR_C$-VAR_D.md5 $VAR_G/$VAR_D.$pveext.md5 - if [ -f $VAR_C$-VAR_D.md5 ]; then - dowmd5=$(cat $VAR_C-$VAR_D.md5 | awk '{print $1}') - rm $VAR_C-$VAR_D.md5 - else - dowmd5="ID2" - fi - chkmd5=$(md5sum $VAR_D.$pveext | awk '{print $1}') - if [ "$dowmd5" != "$chkmd5" ]; then - mkdir $LOGC - cd $LOGC - wget $VAR_G/$VAR_D.$pveext - dowmd5=$(md5sum $VAR_D.$pveext | awk '{print $1}') - if [ "$dowmd5" != "$chkmd5" ]; then - mv $VAR_D.$pveext $pveimagefolder/$VAR_D.$pveext - fi - cd .. - rm -r $LOGC - fi + pct destroy "$VAR_B" fi - if [ ! -f $VAR_D.$pveext ]; then - echo "$(date) - $pvetype Image $VAR_D.$pveext cant be downloaded" >> $LOGP/logs/$LOGF.txt + + sleep 5 + if [ ! -f "$pvefolder/$VAR_B.conf" ]; then + log_msg "🗑️ $VAR_C VM $VAR_B was deleted" else - echo "$(date) - $pvetype Image $VAR_D.$pveext was downloaded" >> $LOGP/logs/$LOGF.txt - fi - if [ "$VAR_C" == "kvm" ]; then - qm create $VAR_B "$VAR_F" - fi - if [ "$VAR_C" == "lxc" ]; then - pct create $VAR_B "$VAR_F" + log_msg "⚠️ $VAR_C VM $VAR_B could not be deleted" fi - if [ ! -f $pvefolder/$VAR_B.conf ]; then - echo "$(date) - $pvetype VServer $VAR_B cant be created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - $pvetype VServer $VAR_B was created" >> $LOGP/logs/$LOGF.txt - VAR_A="changerun" - VAR_E="install" + exit 0 + fi + + cd "$pveimagefolder" || exit 1 + + # Download image if missing + if [ ! -f "$VAR_D.$pveext" ]; then + mkdir -p "$LOGC" && cd "$LOGC" + wget "$VAR_G/$VAR_D.$pveext" + mv "$VAR_D.$pveext" "$pveimagefolder/" + cd .. && rm -rf "$LOGC" + else + wget -q -O "$VAR_C-$VAR_D.md5" "$VAR_G/$VAR_D.$pveext.md5" + if [ -f "$VAR_C-$VAR_D.md5" ]; then + dowmd5=$(awk '{print $1}' "$VAR_C-$VAR_D.md5") + chkmd5=$(md5sum "$VAR_D.$pveext" | awk '{print $1}') + if [ "$dowmd5" != "$chkmd5" ]; then + mkdir -p "$LOGC" && cd "$LOGC" + wget "$VAR_G/$VAR_D.$pveext" + mv "$VAR_D.$pveext" "$pveimagefolder/" + cd .. && rm -rf "$LOGC" + fi + rm -f "$VAR_C-$VAR_D.md5" fi + fi + + if [ ! -f "$VAR_D.$pveext" ]; then + log_msg "❌ $pvetype image $VAR_D.$pveext could not be downloaded" + exit 1 else - echo "$(date) - $pvetype VServer $VAR_B cant be created" >> $LOGP/logs/$LOGF.txt + log_msg "✅ $pvetype image $VAR_D.$pveext downloaded" fi -fi -if [ "$VAR_A" = "statuscheck" ]; then - checka=$(ps aux | grep -v grep | grep -i pbackup$VAR_B-X) - checkb=$(ps aux | grep -v grep | grep -i prestore$VAR_B-X) - if [ ! -n "$checka" ] && [ ! -n "$checkb" ]; then - echo "ID1" + # Create the VM + if [ "$VAR_C" = "kvm" ]; then + qm create "$VAR_B" $VAR_F else - echo "ID2" + pct create "$VAR_B" $VAR_F + fi + + # Confirm creation + if [ -f "$pvefolder/$VAR_B.conf" ]; then + log_msg "✅ $pvetype VM $VAR_B created successfully" + else + log_msg "❌ $pvetype VM $VAR_B failed to create" fi fi +# --- Delete VM via vserver.sh call --- if [ "$VAR_A" = "delete" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) - if [ ! -n "$startchk" ]; then - screen -A -m -d -S v$VAR_A$VAR_B-X ./vserver deleterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" - check=$(ps aux | grep -v grep | grep -i screen | grep -i v$VAR_A$VAR_B-X) + screen_name="v${VAR_A}${VAR_B}-X" + if ! pgrep -f "screen.*$screen_name" > /dev/null; then + screen -A -m -d -S "$screen_name" ./vserver deleterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" fi - if [ ! -n "$check" ]; then - if [ -f $pvefolder/$VAR_B.conf ]; then - echo "ID3" - else - echo "ID2" - fi + + sleep 2 + if ! pgrep -f "screen.*$screen_name" > /dev/null; then + [ ! -f "$pvefolder/$VAR_B.conf" ] && echo "ID2" || echo "ID3" else - echo "ID1" + echo "ID1" fi fi -if [ "$VAR_A" = "deleterun" ]; then - # break - if [ "$VAR_C" == "kvm" ]; then - # - fi - if [ "$VAR_C" == "lxc" ]; then - # +# --- Status Check --- +if [ "$VAR_A" = "statuscheck" ]; then + if ! pgrep -f "pbackup$VAR_B-X|prestore$VAR_B-X" > /dev/null; then + echo "ID1" + else + echo "ID2" fi fi -exit 0 +# --- Deleterun Stub (from vserver.sh) --- +if [ "$VAR_A" = "deleterun" ]; then + log_msg "⚙️ Called deleterun for $VAR_B ($VAR_C) — implement logic if needed." + exit 0 +fi + +exit 0 \ No newline at end of file diff --git a/streams.sh b/streams.sh index 337672b..4af6e88 100755 --- a/streams.sh +++ b/streams.sh @@ -1,324 +1,301 @@ -#! /bin/bash +#!/bin/bash -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net +# TekLabs TekBase - Stream Management Script (Modernized) +# Maintainer: Christian Frankenstein +# Supports: Screen + Docker, Symlinks for base stream setups -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 -VAR_H=$8 -VAR_I=$9 -VAR_J=${10} - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi - -LOGDAY=$(date +"%Y-%m-%d") +VAR_A="$1" # Action +VAR_B="$2" # User +VAR_C="$3" # Stream ID +VAR_D="$4" # Stream type (e.g. radio1) +VAR_E="$5" # Stream engine (e.g. sc_serv, sc_trans, icecast, docker-sc_serv) +VAR_F="$6" # Binary or command +VAR_G="$7" # Port or config value +VAR_H="$8" # Max clients / bitrate +VAR_I="$9" # Admin port or setting +VAR_J="${10}" # DJ port or extra option +# Paths +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) +LOGFILE="$LOGP/logs/$LOGF.txt" +RESTART_PATH="$LOGP/restart" +STREAM_DIR="/home/$VAR_B/streams/$VAR_D" +BASE_IMAGE="/home/server/streams/$VAR_E" -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi +mkdir -p "$LOGP/logs" "$RESTART_PATH" +chmod -R 0777 "$LOGP/logs" "$RESTART_PATH" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +is_docker() { + [[ "$VAR_E" == docker-* ]] +} +docker_image() { + echo "${VAR_E#docker-}" +} +######################## +# START STREAM +######################## if [ "$VAR_A" = "start" ]; then - if [ -f $LOGP/restart/$VAR_B-$VAR_E-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - fi - echo "#! /bin/bash" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "if [ -f /home/$VAR_B/streams/$VAR_D/$VAR_E.pid ]; then" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "pid=\`cat /home/$VAR_B/streams/$VAR_D/$VAR_E.pid\`" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "check=\`ps -p \$pid | grep -i \"$VAR_E\"\`" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "if [ ! -n \"\$check\" ]; then" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "cd $LOGP;sudo -u $VAR_B ./streams 'start' '$VAR_B' '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G' '$VAR_H' '$VAR_I' '$VAR_J'" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - echo "exit 0" >> $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - chmod 0755 $LOGP/restart/$VAR_B-$VAR_E-$VAR_C + restart_file="$RESTART_PATH/$VAR_B-$VAR_E-$VAR_C" + rm -f "$restart_file" - cd /home/$VAR_B/streams/$VAR_D + cat < "$restart_file" +#!/bin/bash +if [ -f /home/$VAR_B/streams/$VAR_D/$VAR_E.pid ]; then + pid=\$(cat /home/$VAR_B/streams/$VAR_D/$VAR_E.pid) + check=\$(ps -p \$pid | grep "$VAR_E") +fi +if [ -z "\$check" ]; then + cd "$LOGP" + sudo -u "$VAR_B" ./streams.sh start "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" "$VAR_I" "$VAR_J" +fi +exit 0 +EOF + chmod 0755 "$restart_file" - if [ "$VAR_E" = "ices" ]; then - if [ -f ices.pid ]; then - check=$(ps -p $(grep -i "ices" ices.pid)) - if [ -n "$check" ]; then - kill -9 $(cat ices.pid) - fi - check=$(ps -p $(grep -i "ices" ices.pid)) - rm ices.pid - fi - if [ -f ices2.pid ]; then - check=$(ps -p $(grep -i "ices2" ices2.pid)) - if [ -n "$check" ]; then - kill -9 $(cat ices2.pid) - fi - check=$(ps -p $(grep -i "ices2" ices2.pid)) - rm ices2.pid + # Ensure stream directory exists + if [ ! -d "$STREAM_DIR" ]; then + mkdir -p "$STREAM_DIR" + chmod 755 "$STREAM_DIR" + if [ -d "$BASE_IMAGE" ]; then + ln -s "$BASE_IMAGE"/* "$STREAM_DIR/" + else + log_msg "Missing base image for $VAR_E in $BASE_IMAGE" + echo "ID2" + exit 1 fi - else - if [ -f $VAR_E.pid ]; then - check=$(ps -p $(grep -i "$VAR_E" $VAR_E.pid)) - if [ -n "$check" ]; then - kill -9 $(cat $VAR_E.pid) - fi - check=$(ps -p $(grep -i "$VAR_E" $VAR_E.pid)) - rm $VAR_E.pid - fi fi - if [ ! -n "$check" ]; then - if [ "$VAR_E" = "sc_serv" ]; then - sed -i '/PortBase=/Ic\PortBase='$VAR_G'' sc_serv.conf - sed -i '/MaxUser=/Ic\MaxUser='$VAR_H'' sc_serv.conf - fi - if [ "$VAR_E" = "sc_trans" ]; then - let VAR_K=$VAR_J+5 - sed -i '/ServerPort=/Ic\ServerPort='$VAR_G'' sc_trans.conf - sed -i '/AdminPort=/Ic\AdminPort='$VAR_I'' sc_trans.conf - sed -i '/DjPort=/Ic\DjPort='$VAR_J'' sc_trans.conf - sed -i '/DjPort2=/Ic\DjPort2='$VAR_K'' sc_trans.conf - sed -i '/Bitrate=/Ic\Bitrate='$VAR_H'' sc_trans.conf - sed -i '/bitrate_1=/Ic\bitrate_1='$VAR_H'' sc_trans.conf - sed -i '/serverport_1=/Ic\serverport_1='$VAR_G'' sc_trans.conf - sed -i '/^Port=/Ic\Port='$VAR_G'' sc_trans.conf - fi - if [ "$VAR_E" = "icecast" ]; then - sed -i '//Ic\'$VAR_G'' icecast.xml - sed -i '//Ic\'$VAR_H'' icecast.xml - fi - if [ "$VAR_E" = "ices" ]; then - sed -i '//Ic\'$VAR_G'' ices.xml - sed -i '//Ic\'$VAR_H'' ices.xml - fi - if [ "$VAR_E" = "ices2" ]; then - sed -i '//Ic\'$VAR_G'' ices2.xml - sed -i '//Ic\'$VAR_H'' ices2.xml - sed -i '//Ic\1' ices2.xml - fi + cd "$STREAM_DIR" || exit 1 - $VAR_F & - echo $! > $VAR_E.pid + # Stop existing PID + [ -f "$VAR_E.pid" ] && kill -9 "$(cat "$VAR_E.pid")" 2>/dev/null && rm -f "$VAR_E.pid" - if [ -f $VAR_E.pid ]; then - if [ -f sc_serv_$VAR_G.pid ]; then - rm sc_serv_$VAR_G.pid - fi - echo "$(date) - Stream /home/$VAR_B/streams/$VAR_D was started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - Stream /home/$VAR_B/streams/$VAR_D cant be started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi + if is_docker; then + dockername="stream_${VAR_B}_${VAR_C}_${VAR_E}" + docker run -d --rm --name "$dockername" \ + -v "$STREAM_DIR":/data \ + -p "$VAR_G:$VAR_G/udp" \ + "$(docker_image)" >/dev/null + sleep 2 + if docker ps | grep -q "$dockername"; then + log_msg "Docker stream $dockername started on $VAR_G" + echo "ID1" + else + log_msg "Docker stream $dockername failed to start" + echo "ID2" + fi else - echo "$(date) - Stream /home/$VAR_B/streams/$VAR_D cant be stopped and restarted ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID3" + # Apply config replacements for known engines + case "$VAR_E" in + sc_serv) + sed -i "s/^PortBase=.*/PortBase=$VAR_G/" sc_serv.conf + sed -i "s/^MaxUser=.*/MaxUser=$VAR_H/" sc_serv.conf + ;; + sc_trans) + DJ_PORT2=$((VAR_J + 5)) + sed -i "s/^ServerPort=.*/ServerPort=$VAR_G/" sc_trans.conf + sed -i "s/^AdminPort=.*/AdminPort=$VAR_I/" sc_trans.conf + sed -i "s/^DjPort=.*/DjPort=$VAR_J/" sc_trans.conf + sed -i "s/^DjPort2=.*/DjPort2=$DJ_PORT2/" sc_trans.conf + ;; + icecast) + sed -i "s/.*<\/port>/$VAR_G<\/port>/" icecast.xml + sed -i "s/.*<\/clients>/$VAR_H<\/clients>/" icecast.xml + ;; + ices) + sed -i "s/.*<\/port>/$VAR_G<\/port>/" ices.xml + sed -i "s/.*<\/bitrate>/$VAR_H<\/bitrate>/" ices.xml + ;; + ices2) + sed -i "s/.*<\/Port>/$VAR_G<\/Port>/" ices2.xml + sed -i "s/.*<\/nominal-bitrate>/$VAR_H<\/nominal-bitrate>/" ices2.xml + ;; + esac + + $VAR_F & + echo $! > "$VAR_E.pid" + + if [ -f "$VAR_E.pid" ]; then + log_msg "Stream $VAR_E for $VAR_B/$VAR_D started on port $VAR_G" + echo "ID1" + else + log_msg "Stream $VAR_E for $VAR_B/$VAR_D failed to start" + echo "ID2" + fi fi fi - +######################## +# STOP STREAM +######################## if [ "$VAR_A" = "stop" ]; then - if [ -f $LOGP/restart/$VAR_B-$VAR_E-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-$VAR_E-$VAR_C - fi + rm -f "$RESTART_PATH/$VAR_B-$VAR_E-$VAR_C" + cd "$STREAM_DIR" || exit 1 - cd /home/$VAR_B/streams/$VAR_D - if [ "$VAR_E" = "ices" ]; then - if [ -f ices.pid ]; then - check=$(ps -p $(grep -i "ices" ices.pid)) - if [ -n "$check" ]; then - kill -9 $(cat ices.pid) - fi - check=$(ps -p $(grep -i "ices" ices.pid)) - rm ices.pid - fi - if [ -f ices2.pid ]; then - check=$(ps -p $(grep -i "ices2" ices2.pid)) - if [ -n "$check" ]; then - kill -9 $(cat ices2.pid) - fi - check=$(ps -p $(grep -i "ices2" ices2.pid)) + if is_docker; then + dockername="stream_${VAR_B}_${VAR_C}_${VAR_E}" + docker stop "$dockername" >/dev/null + sleep 1 + if ! docker ps | grep -q "$dockername"; then + log_msg "Docker stream $dockername stopped" + echo "ID1" + else + log_msg "Failed to stop docker stream $dockername" + echo "ID2" fi else - if [ -f $VAR_E.pid ]; then - check=$(ps -p $(grep -i "$VAR_E" $VAR_E.pid)) - if [ -n "$check" ]; then - kill -9 $(cat $VAR_E.pid) - fi - check=$(ps -p $(grep -i "$VAR_E" $VAR_E.pid)) - rm $VAR_E.pid + if [ -f "$VAR_E.pid" ]; then + kill -9 "$(cat "$VAR_E.pid")" 2>/dev/null + rm -f "$VAR_E.pid" + fi + if ! pgrep -f "$VAR_E" > /dev/null; then + log_msg "Stream $VAR_E on $VAR_B/$VAR_D stopped" + echo "ID1" + else + log_msg "Failed to stop stream $VAR_E on $VAR_B/$VAR_D" + echo "ID2" fi fi +fi - if [ ! -n "$check" ]; then - echo "$(date) - Stream /home/$VAR_B/streams/$VAR_D was stopped" >> $LOGP/logs/$LOGF.txt - echo "ID1" +######################## +# STREAM STATUS +######################## +if [ "$VAR_A" = "status" ]; then + if is_docker; then + dockername="stream_${VAR_B}_${VAR_C}_${VAR_E}" + if docker ps | grep -q "$dockername"; then + echo "ID2" + else + echo "ID1" + fi else - echo "$(date) - Stream /home/$VAR_B/streams/$VAR_D cant be stopped" >> $LOGP/logs/$LOGF.txt - echo "ID2" + if pgrep -f "$VAR_E" > /dev/null; then + echo "ID2" + else + echo "ID1" + fi fi fi +######################## +# REWRITE CONFIG LINE +######################## if [ "$VAR_A" = "rewrite" ]; then - cd /home/$VAR_B/streams/$VAR_D - if [ "$VAR_C" = "ic" ]; then - if [ "$VAR_F" != "" ]; then - sed -i '/'$VAR_F'/Ic\'$VAR_G'' $VAR_E - check=$(grep -i "$VAR_G" VAR_E) - if [ ! -n "$check" ]; then - echo "" >> $VAR_E - echo "$VAR_G" >> $VAR_E - fi - fi - else - if [ "$VAR_F" != "" ]; then - sed -i '/'$VAR_F'/Ic\'$VAR_G'' $VAR_E - check=$(grep -i "$VAR_G" VAR_E) - if [ ! -n "$check" ]; then - echo "" >> $VAR_E - echo "$VAR_G" >> $VAR_E - fi - fi + cd "$STREAM_DIR" || exit 1 + if [ -n "$VAR_F" ]; then + sed -i "/$VAR_F/Ic\\$VAR_G" "$VAR_E" + if ! grep -iq "$VAR_G" "$VAR_E"; then + echo "$VAR_G" >> "$VAR_E" + fi + log_msg "Rewrote $VAR_F to $VAR_G in $VAR_E" fi fi +######################## +# UPDATE STREAM +######################## if [ "$VAR_A" = "update" ]; then - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_B$VAR_D-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S b$VAR_B$VAR_D-X ./streams updaterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" - echo "ID1" - else - echo "$(date) - Update of /home/$VAR_B/streams/$VAR_D cant be installed" >> $LOGP/logs/$LOGF.txt + if pgrep -f "$VAR_B$VAR_D-X" > /dev/null; then + log_msg "Stream update blocked: already running" echo "ID2" + else + screen -A -m -d -S "b$VAR_B$VAR_D-X" ./streams.sh updaterun "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" + sleep 2 + if pgrep -f "b$VAR_B$VAR_D-X" > /dev/null; then + echo "ID1" + else + echo "ID2" + fi fi fi if [ "$VAR_A" = "updaterun" ]; then sleep 2 - cd /home/$VAR_B/streams/$VAR_D - comlist=$(echo "${VAR_E//;/$'\n'}") - while read LINE - do - if [ "$LINE" != "" ]; then - $LINE - fi - done < <(echo "$comlist") - echo "$(date) - Update of /home/$VAR_B/streams/$VAR_D was installed" >> $LOGP/logs/$LOGF.txt + cd "$STREAM_DIR" || exit 1 + IFS=$'\n' + for cmd in $(echo "$VAR_E" | tr ';' '\n'); do + if [ -n "$cmd" ]; then + eval "$cmd" + fi + done + unset IFS + log_msg "Update applied for stream $VAR_D" + echo "ID1" fi - +######################## +# GENERATE PLAYLISTS +######################## if [ "$VAR_A" = "playlist" ]; then - cd /home/$VAR_B/streams/$VAR_D + cd "$STREAM_DIR" || exit 1 + mkdir -p playlists songs + if [ "$VAR_C" = "ic" ]; then - find /home/$VAR_B/streams/$VAR_D/mp3/ -type f -name "*.mp3" > /home/$VAR_B/streams/$VAR_D/mp3_playlist.lst - if [ -f mp3_playlist.lst ]; then - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/mp3_playlist.lst was created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/mp3_playlist.lst cant be created" >> $LOGP/logs/$LOGF.txt - fi - find /home/$VAR_B/streams/$VAR_C/ogg/ -type f -name "*.ogg" > /home/$VAR_B/streams/$VAR_C/ogg_playlist.lst - if [ -f ogg_playlist.lst ]; then - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_C/ogg_playlist.lst was created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_C/ogg_playlist.lst cant be created" >> $LOGP/logs/$LOGF.txt - fi + find mp3/ -type f -name "*.mp3" > mp3_playlist.lst + find ogg/ -type f -name "*.ogg" > ogg_playlist.lst + log_msg "IC-style playlists created in $STREAM_DIR" else - if [ -f playlist.plo ]; then - echo "#Mode=Basic" > /home/$VAR_B/streams/$VAR_D/playlist.plo - find /home/$VAR_B/streams/$VAR_D/videos/ -type f -name "*.nsv" >> /home/$VAR_B/streams/$VAR_D/playlist.plo - if [ -f playlist.plo ]; then - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlist.plo was created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlist.plo cant be created" >> $LOGP/logs/$LOGF.txt - fi - fi - if [ "$VAR_E" != "" ]; then - if [ "$VAR_F" != "" ]; then - cd songs - mkdir -p $VAR_F - cd /home/$VAR_B/streams/$VAR_D - find /home/$VAR_B/streams/$VAR_D/songs/$VAR_F/ -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.acc" \) > /home/$VAR_B/streams/$VAR_D/playlists/$VAR_E.lst - if [ -f $VAR_E.lst ]; then - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlists/$VAR_E.lst was created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlists/$VAR_E.lst cant be created" >> $LOGP/logs/$LOGF.txt - fi - else - find /home/$VAR_B/streams/$VAR_D/songs/ -maxdepth 1 -type f -name "*.mp3" > /home/$VAR_B/streams/$VAR_D/playlists/$VAR_E.lst - if [ -f $VAR_F/$VAR_E.lst ]; then - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlists/$VAR_E.lst was created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlists/$VAR_E.lst cant be created" >> $LOGP/logs/$LOGF.txt - fi - fi - else - if [ -f playlist.lst ]; then - find /home/$VAR_B/streams/$VAR_D/songs/ -type f -name "*.mp3" > /home/$VAR_B/streams/$VAR_D/playlist.lst - if [ -f playlist.lst ]; then - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlist.lst was created" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Playlist /home/$VAR_B/streams/$VAR_D/playlist.lst cant be created" >> $LOGP/logs/$LOGF.txt - fi - fi - fi + if [ -n "$VAR_E" ]; then + if [ -n "$VAR_F" ]; then + mkdir -p "songs/$VAR_F" + find "songs/$VAR_F" -maxdepth 1 -type f \( -iname "*.mp3" -o -iname "*.aac" \) > "playlists/$VAR_E.lst" + log_msg "Playlist $VAR_E.lst created from songs/$VAR_F" + else + find songs/ -maxdepth 1 -type f -iname "*.mp3" > "playlists/$VAR_E.lst" + log_msg "Playlist $VAR_E.lst created from songs/" + fi + else + find songs/ -type f -iname "*.mp3" > playlist.lst + log_msg "Default playlist.lst created from songs/" + fi fi fi +######################## +# OUTPUT FILE CONTENT +######################## if [ "$VAR_A" = "content" ]; then - cd /home/$VAR_B/streams/$VAR_D - check=$(cat $VAR_E) - for LINE in $check - do - echo "$LINE%TEND%" - done -fi - -if [ "$VAR_A" = "streamstats" ]; then - check=$(php -f php/stream_check.php) - #chkbitrate=$(echo "$check" | awk '{print $1}') - chkslots=$(echo "$check" | awk '{print $2}') - chktitle=$(echo "$check" | awk '{for (i=3;i<=NF;i++) { - printf("%s ", $i); - }}') - cd /home/$VAR_B/streams/$VAR_C/stats - checktwo=$(grep -i "$chktitle" $LOGF.txt | awk '{print $3, $4}') - if [ "$checktwo" != "" ]; then - listeners=$(echo "$checktwo" | awk '{print $2}') - if [ "$listeners" == "" ]; then - listeners="0" - fi - if [ $listeners -lt $chkslots ]; then - sed -i '/'$chktitle'/Ic\'$LOGDAY' | Listeners '$chkslots' | Title '$chktitle'' $LOGF.txt - fi + cd "$STREAM_DIR" || exit 1 + if [ -f "$VAR_E" ]; then + while IFS= read -r LINE; do + echo "$LINE%TEND%" + done < "$VAR_E" else - echo "$LOGDAY | Listeners $chkslots | Title $chktitle" >> $LOGF.txt + echo "File not found: $VAR_E" fi fi -if [ "$VAR_A" = "status" ]; then - check=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_E$VAR_B$VAR_D-X") - if [ ! -n "$check" ]; then - echo "ID1" +######################## +# STREAM STATISTICS +######################## +if [ "$VAR_A" = "streamstats" ]; then + STATS_DIR="/home/$VAR_B/streams/$VAR_C/stats" + mkdir -p "$STATS_DIR" + cd "$STATS_DIR" || exit 1 + + STREAM_CHECK=$(php -f php/stream_check.php) + CURRENT_SLOTS=$(echo "$STREAM_CHECK" | awk '{print $2}') + CURRENT_TITLE=$(echo "$STREAM_CHECK" | awk '{for (i=3;i<=NF;i++) printf("%s ", $i)}') + + EXISTING_ENTRY=$(grep -i "$CURRENT_TITLE" "$LOGF.txt" | awk '{print $3, $4}') + if [ -n "$EXISTING_ENTRY" ]; then + LISTENERS=$(echo "$EXISTING_ENTRY" | awk '{print $2}') + [ -z "$LISTENERS" ] && LISTENERS="0" + if [ "$LISTENERS" -lt "$CURRENT_SLOTS" ]; then + sed -i "/$CURRENT_TITLE/Ic\\$LOGDAY | Listeners $CURRENT_SLOTS | Title $CURRENT_TITLE" "$LOGF.txt" + fi else - echo "ID2" + echo "$LOGDAY | Listeners $CURRENT_SLOTS | Title $CURRENT_TITLE" >> "$LOGF.txt" fi fi - - -exit 0 +######################## +# EXIT +######################## +exit 0 \ No newline at end of file diff --git a/tekbase.sh b/tekbase.sh index e0cc0ee..99a15fd 100755 --- a/tekbase.sh +++ b/tekbase.sh @@ -1,24 +1,38 @@ -#! /bin/bash - -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net - - -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 -VAR_H=$8 -VAR_I=$9 -VAR_J=${10} - -if [ "$VAR_A" = "" ]; then +#!/bin/bash + +# TekLabs TekBase - Modernized User & Server Management Script +# Maintainer: Christian Frankenstein +# Updated: 2025-04-16 + +# Parameters +VAR_A="$1" +VAR_B="$2" +VAR_C="$3" +VAR_D="$4" +VAR_E="$5" +VAR_F="$6" +VAR_G="$7" +VAR_H="$8" +VAR_I="$9" +VAR_J="${10}" + +# Setup Paths and Logging +LOGP=$(cd "$(dirname "$0")" && pwd) +LOGF=$(date +"%Y_%m") +LOGC=$(date +"%Y_%m-%H_%M_%S") +LOGFILE="$LOGP/logs/$LOGF.txt" + +mkdir -p "$LOGP/logs" "$LOGP/restart" "$LOGP/startscripte" "$LOGP/cache" +chmod -R 0777 "$LOGP/logs" "$LOGP/restart" "$LOGP/startscripte" "$LOGP/cache" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" + +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +# Info header for default run +if [ -z "$VAR_A" ]; then LOGY=$(date +"%Y") clear echo "###########################################" @@ -29,610 +43,521 @@ if [ "$VAR_A" = "" ]; then echo "# www.teklab.us #" echo "###########################################" fi - -LOGF=$(date +"%Y_%m") -LOGC=$(date +"%Y_%m-%H_%M_%S") -LOGP=$(pwd) - -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi -if [ ! -d startscripte ]; then - mkdir startscripte - chmod 0777 startscripte -fi - -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi - case "$VAR_A" in - # User anlegen + # ---------------------------- + # Case 1: Create or update user + # ---------------------------- 1) - if [ ! -d /home/$VAR_B ] ; then - useradd -g users -p $(perl -e 'print crypt("'$VAR_C'","Sa")') -s /bin/bash -m $VAR_B -d /home/$VAR_B - if [ ! -d /home/$VAR_B ]; then - echo "$(date) - Error: User $VAR_B cant be created" >> $LOGP/logs/$LOGF.txt - echo "ID2" - else - echo "$(date) - User $VAR_B was created" >> $LOGP/logs/$LOGF.txt - echo "ID1" - fi + if [ ! -d /home/"$VAR_B" ]; then + useradd -g users -p "$(perl -e 'print crypt("'"$VAR_C"'","Sa")')" -s /bin/bash -m "$VAR_B" -d /home/"$VAR_B" + if [ ! -d /home/"$VAR_B" ]; then + log_msg "Error: User $VAR_B could not be created" + echo "ID2" + else + log_msg "User $VAR_B was created" + echo "ID1" + fi else - usermod -p $(perl -e 'print crypt("'$VAR_C'","Sa")') $VAR_B - echo "$(date) - User $VAR_B was existing and changed" >> $LOGP/logs/$LOGF.txt - echo "ID1" + usermod -p "$(perl -e 'print crypt("'"$VAR_C"'","Sa")')" "$VAR_B" + log_msg "User $VAR_B already existed and password was updated" + echo "ID1" fi ;; - # User bearbeiten + + # ---------------------------- + # Case 2: Change user password + # ---------------------------- 2) - usermod -p $(perl -e 'print crypt("'$VAR_C'","Sa")') $VAR_B - echo "$(date) - User $VAR_B was changed" >> $LOGP/logs/$LOGF.txt + usermod -p "$(perl -e 'print crypt("'"$VAR_C"'","Sa")')" "$VAR_B" + log_msg "User $VAR_B password was changed" echo "ID1" ;; - # User entfernen 1-2 + + # ---------------------------- + # Case 3: Delete user (step 1 - initiate) + # ---------------------------- 3) - rm $LOGP/restart/$VAR_B* - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "d$VAR_B-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S d$VAR_B-X ./tekbase 4 $VAR_B $VAR_C - check=$(ps aux | grep -v grep | grep -i screen | grep -i "d$VAR_B-X") + rm -f "$LOGP/restart/$VAR_B"* + screenname="d${VAR_B}-X" + startchk=$(pgrep -f "screen.*$screenname") + + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" 4 "$VAR_B" "$VAR_C" + sleep 1 + check=$(pgrep -f "screen.*$screenname") fi - if [ ! -n "$check" ]; then - if [ ! -d /home/$VAR_B ]; then - echo "$(date) - User $VAR_B was deleted" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - Error: User $VAR_B cant be deleted" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi + + if [ -z "$check" ]; then + if [ ! -d /home/"$VAR_B" ]; then + log_msg "User $VAR_B was deleted" + echo "ID1" + else + log_msg "Error: User $VAR_B could not be deleted" + echo "ID2" + fi else - echo "$(date) - User $VAR_B was deleted" >> $LOGP/logs/$LOGF.txt - echo "ID1" + log_msg "User $VAR_B deletion screen started" + echo "ID1" fi ;; - # User entfernen 2-2 + + # ---------------------------- + # Case 4: Delete user (step 2 - deep clean) + # ---------------------------- 4) counter=0 deleteall=0 if [ "$VAR_C" != "all" ]; then - while [ $counter != 1 ]; do - totalcount=0 - cd /home/$VAR_B - if [ -d apps ]; then - cd apps - acounter=$(find -type d | wc -l) - if [ "$acounter" != "1" ]; then - totalcount=1 - fi - cd .. - fi - if [ -d server ]; then - cd server - scounter=$(find -type d | wc -l) - if [ "$scounter" != "1" ]; then - totalcount=1 - fi - cd .. - fi - if [ -d streams ]; then - cd streams - sscounter=$(find -type d | wc -l) - if [ "$sscounter" != "1" ]; then - totalcount=1 - fi - cd .. - fi - if [ -d voice ]; then - cd voice - vcounter=$(find -type d | wc -l) - if [ "$vcounter" != "1" ]; then - totalcount=1 - fi - cd .. - fi - if [ -d vstreams ]; then - cd vstreams - vscounter=$(find -type d | wc -l) - if [ "$vscounter" != "1" ]; then - totalcount=1 - fi - cd .. - fi - if [ "$totalcount" = "1" ]; then - sleep 5 - let deleteall=$deleteall+1 - else - counter=1 - fi - if [ "$deleteall" = "5" ]; then - cd /home/$VAR_B - rm -r * - counter=1 - fi - done + while [ "$counter" -ne 1 ]; do + totalcount=0 + cd /home/"$VAR_B" || break + + for folder in apps server streams voice vstreams; do + if [ -d "$folder" ]; then + cd "$folder" || continue + subcount=$(find -type d | wc -l) + [ "$subcount" -ne 1 ] && totalcount=1 + cd .. + fi + done + + if [ "$totalcount" -eq 1 ]; then + sleep 5 + deleteall=$((deleteall + 1)) + else + counter=1 + fi + + if [ "$deleteall" -eq 5 ]; then + cd /home/"$VAR_B" && rm -rf * + counter=1 + fi + done fi - userdel $VAR_B - cd /home - rm -r $VAR_B - rm -r /var/run/screen/S-$VAR_B - rm -r /var/run/uscreen/S-$VAR_B + userdel "$VAR_B" + rm -rf /home/"$VAR_B" + rm -rf /var/run/screen/S-"$VAR_B" + rm -rf /var/run/uscreen/S-"$VAR_B" + log_msg "User $VAR_B and home directory removed" ;; - # Games/Apps/Voice/Stream installieren 1-2 + # ---------------------------- + # Case 5: Install - Step 1 (screen launch) + # ---------------------------- 5) - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_B$VAR_C-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S i$VAR_B$VAR_C-X ./tekbase 6 $VAR_B $VAR_C $VAR_D $VAR_E $VAR_F $VAR_G $VAR_H - check=$(ps aux | grep -v grep | grep -i screen | grep -i "i$VAR_B$VAR_C-X") + screenname="i${VAR_B}${VAR_C}-X" + startchk=$(pgrep -f "screen.*$screenname") + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" 6 "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" "$VAR_H" + sleep 1 + check=$(pgrep -f "screen.*$screenname") fi - if [ ! -n "$check" ]; then - if [ ! -d /home/$VAR_B/$VAR_F/$VAR_C ]; then - echo "ID2" - else - echo "ID1" - fi + + if [ -z "$check" ]; then + [ ! -d /home/"$VAR_B"/"$VAR_F"/"$VAR_C" ] && echo "ID2" || echo "ID1" else - echo "ID1" + echo "ID1" fi ;; - # Games/Apps/Voice/Stream installieren 2-2 + + # ---------------------------- + # Case 6: Install - Step 2 (actual install) + # ---------------------------- 6) - cd /home/$VAR_B - su $VAR_B -c "mkdir -p $VAR_F" - cd $VAR_F + cd /home/"$VAR_B" || exit 1 + su "$VAR_B" -c "mkdir -p '$VAR_F'" + cd "$VAR_F" || exit 1 + if [ "$VAR_G" = "delete" ]; then - sleep 10 - rm -r $VAR_C - if [ -f $VAR_C.tar ]; then - rm $VAR_C.tar - fi + sleep 10 + rm -rf "$VAR_C" + [ -f "$VAR_C.tar" ] && rm "$VAR_C.tar" fi - su $VAR_B -c "mkdir $VAR_C" - if [ ! -d $VAR_C ]; then - echo "$(date) - Folder /home/$VAR_B/$VAR_F/$VAR_C cant be created" >> $LOGP/logs/$LOGF.txt + + su "$VAR_B" -c "mkdir '$VAR_C'" + if [ ! -d "$VAR_C" ]; then + log_msg "Folder /home/$VAR_B/$VAR_F/$VAR_C could not be created" else -# if [ "$VAR_F" = "server" ]; then -# passwd=`pwgen 10 1` -# useradd -g users -p `perl -e 'print crypt("'$passwd'","Sa")'` -s /bin/bash $VAR_B-$VAR_C -d /home/$VAR_B/server/$VAR_C -# echo "$(date) - Gameserver user $VAR_B-$VAR_C was created" >> $LOGP/logs/$LOGF.txt -# fi - echo "$(date) - Folder /home/$VAR_B/$VAR_F/$VAR_C was created" >> $LOGP/logs/$LOGF.txt -# if [ "$VAR_G" = "protect" ]; then -# chown -R $VAR_H $VAR_C -# chmod 755 $VAR_C -# fi + log_msg "Folder /home/$VAR_B/$VAR_F/$VAR_C was created" fi - if [ -f $VAR_G ] && [ "$VAR_G" != "" ]; then - mv $VAR_G /home/$VAR_B/$VAR_F/$VAR_C/install.sh - cd /home/$VAR_B/$VAR_F/$VAR_C - chown $VAR_B install.sh - chmod 755 install.sh - su $VAR_B -c "./install.sh" - rm install.sh - counter=$(find -type f | wc -l) - if [ "$counter" != "0" ]; then - echo "$(date) - Script in $VAR_B/$VAR_F/$VAR_C was installed" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Script in $VAR_B/$VAR_F/$VAR_C cant be installed" >> $LOGP/logs/$LOGF.txt - fi - exit 0 + if [ -f "$VAR_G" ] && [ -n "$VAR_G" ]; then + mv "$VAR_G" "/home/$VAR_B/$VAR_F/$VAR_C/install.sh" + cd "/home/$VAR_B/$VAR_F/$VAR_C" || exit 1 + chown "$VAR_B" install.sh + chmod 755 install.sh + su "$VAR_B" -c "./install.sh" + rm install.sh + + counter=$(find . -type f | wc -l) + [ "$counter" -ne 0 ] && log_msg "Script in $VAR_B/$VAR_F/$VAR_C installed" || log_msg "Script in $VAR_B/$VAR_F/$VAR_C could not be installed" + exit 0 fi - cd $LOGP + cd "$LOGP" || exit 1 mkdir -p cache - cd cache - if [ ! -f $VAR_D.tar ]; then - mkdir $LOGC - cd $LOGC - wget $VAR_E/$VAR_D.tar - mv $VAR_D.tar $LOGP/cache/$VAR_D.tar - cd $LOGP/cache - rm -r $LOGC + cd cache || exit 1 + + if [ ! -f "$VAR_D.tar" ]; then + mkdir "$LOGC" + cd "$LOGC" || exit 1 + wget "$VAR_E/$VAR_D.tar" + mv "$VAR_D.tar" "$LOGP/cache/$VAR_D.tar" + cd "$LOGP/cache" || exit 1 + rm -rf "$LOGC" else - if [ -f $VAR_B$VAR_C.md5 ]; then - rm $VAR_B$VAR_C.md5 - fi - wget -O $VAR_B$VAR_C.md5 $VAR_E/$VAR_D.tar.md5 - if [ -f $VAR_B$VAR_C.md5 ]; then - dowmd5=$(cat $VAR_B$VAR_C.md5 | awk '{print $1}') - rm $VAR_B$VAR_C.md5 - else - dowmd5="ID2" - fi - chkmd5=$(md5sum $VAR_D.tar | awk '{print $1}') - if [ "$dowmd5" != "$chkmd5" ]; then - mkdir $LOGC - cd $LOGC - wget $VAR_E/$VAR_D.tar - dowmd5=$(md5sum $VAR_D.tar | awk '{print $1}') - if [ "$dowmd5" != "$chkmd5" ]; then - mv $VAR_D.tar $LOGP/cache/$VAR_D.tar - fi - cd $LOGP/cache - rm -r $LOGC - fi + [ -f "$VAR_B$VAR_C.md5" ] && rm "$VAR_B$VAR_C.md5" + wget -O "$VAR_B$VAR_C.md5" "$VAR_E/$VAR_D.tar.md5" + if [ -f "$VAR_B$VAR_C.md5" ]; then + dowmd5=$(awk '{print $1}' "$VAR_B$VAR_C.md5") + rm "$VAR_B$VAR_C.md5" + else + dowmd5="ID2" + fi + chkmd5=$(md5sum "$VAR_D.tar" | awk '{print $1}') + if [ "$dowmd5" != "$chkmd5" ]; then + mkdir "$LOGC" + cd "$LOGC" || exit 1 + wget "$VAR_E/$VAR_D.tar" + dowmd5=$(md5sum "$VAR_D.tar" | awk '{print $1}') + [ "$dowmd5" != "$chkmd5" ] && mv "$VAR_D.tar" "$LOGP/cache/$VAR_D.tar" + cd "$LOGP/cache" || exit 1 + rm -rf "$LOGC" + fi fi - if [ ! -f $VAR_D.tar ]; then - echo "$(date) - Image $VAR_D.tar cant be downloaded" >> $LOGP/logs/$LOGF.txt + + if [ ! -f "$VAR_D.tar" ]; then + log_msg "Image $VAR_D.tar could not be downloaded" else - echo "$(date) - Image $VAR_D.tar was downloaded" >> $LOGP/logs/$LOGF.txt - if [ "$VAR_G" = "protect" ]; then - userchk=$(grep ^$VAR_B-p: /etc/passwd | grep -i "sec") - if [ "$userchk" = "" ]; then - passwd=$(pwgen 8 1 -c -n) - useradd -g users -p $(perl -e 'print crypt("'$passwd'","Sa")') -s /bin/bash $VAR_B-p -d /home/$VAR_B/$VAR_F/$VAR_C - fi - cd /home/$VAR_B/$VAR_F - chown $VAR_B-p:users $VAR_C - chmod 755 $VAR_C - cd $LOGP/cache - su $VAR_B-p -c "tar -xf $VAR_D.tar -C /home/$VAR_B/$VAR_F/$VAR_C" - else - su $VAR_B -c "tar -xf $VAR_D.tar -C /home/$VAR_B/$VAR_F/$VAR_C" - fi - - cd /home/$VAR_B/$VAR_F/$VAR_C - if [ -f install.sh ]; then - chmod 0777 install.sh - su $VAR_B -c "./install.sh" - rm install.sh - fi - if [ "$VAR_F" = "server" ]; then - cd /home/$VAR_B/$VAR_F/$VAR_C - for PROTLINE in $(cat $LOGP/includes/$VAR_D/protect.inf) - do - if [ -f $PROTLINE ]; then - chown $VAR_B-p:users $PROTLINE - chmod 554 $PROTLINE - fi - done - fi - counter=$(find -type f | wc -l) - if [ "$counter" != "0" ]; then - echo "$(date) - Image $VAR_D.tar was installed" >> $LOGP/logs/$LOGF.txt - else - echo "$(date) - Image $VAR_D.tar cant be installed" >> $LOGP/logs/$LOGF.txt - fi + log_msg "Image $VAR_D.tar was downloaded" + if [ "$VAR_G" = "protect" ]; then + userchk=$(grep "^$VAR_B-p:" /etc/passwd | grep -i sec) + if [ -z "$userchk" ]; then + passwd=$(pwgen 8 1 -c -n) + useradd -g users -p "$(perl -e 'print crypt("'"$passwd"'","Sa")')" -s /bin/bash "$VAR_B-p" -d "/home/$VAR_B/$VAR_F/$VAR_C" + fi + cd "/home/$VAR_B/$VAR_F" || exit 1 + chown "$VAR_B-p:users" "$VAR_C" + chmod 755 "$VAR_C" + cd "$LOGP/cache" || exit 1 + su "$VAR_B-p" -c "tar -xf $VAR_D.tar -C /home/$VAR_B/$VAR_F/$VAR_C" + else + su "$VAR_B" -c "tar -xf $VAR_D.tar -C /home/$VAR_B/$VAR_F/$VAR_C" + fi + + cd "/home/$VAR_B/$VAR_F/$VAR_C" || exit 1 + [ -f install.sh ] && chmod 0777 install.sh && su "$VAR_B" -c "./install.sh" && rm install.sh + + if [ "$VAR_F" = "server" ]; then + cd "$LOGP/includes/$VAR_D" || exit 1 + for PROTLINE in $(cat protect.inf); do + [ -f "$PROTLINE" ] && chown "$VAR_B-p:users" "$PROTLINE" && chmod 554 "$PROTLINE" + done + fi + + counter=$(find . -type f | wc -l) + [ "$counter" -ne 0 ] && log_msg "Image $VAR_D.tar installed" || log_msg "Image $VAR_D.tar could not be installed" fi sleep 2 ;; - # Games/Apps/Voice/Stream deinstallieren 1-2 + + # ---------------------------- + # Case 7: Deinstall - Step 1 (screen launch) + # ---------------------------- 7) - if [ -f $LOGP/restart/$VAR_B-$VAR_D-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-$VAR_D-$VAR_C - fi - startchk=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_B$VAR_C-X") - if [ ! -n "$startchk" ]; then - screen -A -m -d -S d$VAR_B$VAR_C-X ./tekbase 8 $VAR_B $VAR_C $VAR_D - check=$(ps aux | grep -v grep | grep -i screen | grep -i "d$VAR_B$VAR_C-X") + [ -f "$LOGP/restart/$VAR_B-$VAR_D-$VAR_C" ] && rm "$LOGP/restart/$VAR_B-$VAR_D-$VAR_C" + screenname="d${VAR_B}${VAR_C}-X" + startchk=$(pgrep -f "screen.*$screenname") + + if [ -z "$startchk" ]; then + screen -A -m -d -S "$screenname" "$0" 8 "$VAR_B" "$VAR_C" "$VAR_D" + sleep 1 + check=$(pgrep -f "screen.*$screenname") fi - if [ ! -n "$check" ]; then - cd /home/$VAR_B/$VAR_D - if [ ! -d $VAR_C ]; then - echo "ID1" - else - echo "ID2" - fi + + if [ -z "$check" ]; then + [ ! -d /home/"$VAR_B"/"$VAR_D"/"$VAR_C" ] && echo "ID1" || echo "ID2" else - echo "ID1" + echo "ID1" fi ;; - # Games/Apps/Voice/Stream deinstallieren 2-2 + + # ---------------------------- + # Case 8: Deinstall - Step 2 + # ---------------------------- 8) sleep 10 - cd /home/$VAR_B/$VAR_D - rm -r $VAR_C - - userchk=$(grep ^$VAR_B-p: /etc/passwd | grep -i "sec") - if [ "$userchk" != "" ]; then - killall -u $VAR_B-p - sleep 10 - userdel $VAR_B-p - cd /home - rm -r $VAR_B - rm -r /var/run/screen/S-$VAR_B-p - rm -r /var/run/uscreen/S-$VAR_B-p - fi - if [ -d $LOGP/cache/$VAR_B$VAR_D ]; then - cd $LOGP/cache - rm $VAR_B$VAR_D - fi - cd $LOGP/cache - if [ -d $VAR_B$VAR_C ]; then - rm -r $VAR_B$VAR_C + cd /home/"$VAR_B"/"$VAR_D" || exit 1 + rm -rf "$VAR_C" + + userchk=$(grep "^$VAR_B-p:" /etc/passwd | grep -i sec) + if [ -n "$userchk" ]; then + killall -u "$VAR_B-p" + sleep 10 + userdel "$VAR_B-p" + rm -rf /home/"$VAR_B" + rm -rf /var/run/screen/S-"$VAR_B-p" + rm -rf /var/run/uscreen/S-"$VAR_B-p" fi - if [ ! -d $VAR_C ]; then - echo "$(date) - Folder /home/$VAR_B/$VAR_D/$VAR_C was deleted" >> $LOGP/logs/$LOGF.txt + + [ -d "$LOGP/cache/$VAR_B$VAR_D" ] && rm -f "$LOGP/cache/$VAR_B$VAR_D" + [ -d "$LOGP/cache/$VAR_B$VAR_C" ] && rm -rf "$LOGP/cache/$VAR_B$VAR_C" + + if [ ! -d "$VAR_C" ]; then + log_msg "Folder /home/$VAR_B/$VAR_D/$VAR_C was deleted" else - echo "$(date) - Folder /home/$VAR_B/$VAR_D/$VAR_C cant be deleted" >> $LOGP/logs/$LOGF.txt + log_msg "Folder /home/$VAR_B/$VAR_D/$VAR_C could not be deleted" fi ;; - # FTP User anlegen + # FTP User Creation 9) - uid=$(grep home/$VAR_B /etc/passwd | cut -d : -f3) - gid=$(grep home/$VAR_B /etc/passwd | cut -d : -f4) - /usr/bin/expect<> $LOGP/logs/$LOGF.txt - else - echo "$(date) - VServer $VAR_B cant be deleted" >> $LOGP/logs/$LOGF.txt - fi - cd /etc/vz/conf - rm $VAR_B.conf.destroyed - if [ -d /usr/vz/$VAR_B ]; then - cd /usr/vz - rm -r $VAR_B - fi + check=$(vzctl status "$VAR_B" | grep -i running) + [ -n "$check" ] && vzctl stop "$VAR_B" + vzctl destroy "$VAR_B" + if [ ! -f /etc/vz/conf/"$VAR_B".conf ]; then + echo "$(date) - VServer $VAR_B was deleted" >> "$LOGP/logs/$LOGF.txt" + else + echo "$(date) - VServer $VAR_B cant be deleted" >> "$LOGP/logs/$LOGF.txt" + fi + cd /etc/vz/conf + rm -f "$VAR_B.conf.destroyed" + [ -d /usr/vz/"$VAR_B" ] && rm -rf "/usr/vz/$VAR_B" fi if [ "$VAR_C" = "traffic" ]; then - for i in $(./tekbase 24 99 iplist) - do - traffic=$(iptables -nvx -L FORWARD | grep " $i " | tr -s [:blank:] |cut -d' ' -f3| awk '{sum+=$1} END {print sum;}') - if [ -n "$VAR_E" ]; then - wget --post-data 'op=vtraffic&key='$VAR_B'&rid='$VAR_E'&vip='$i'&traffic='$traffic'' -O - $VAR_D/automated.php - else - wget --post-data 'op=vtraffic&key='$VAR_B'&vip='$i'&traffic='$traffic'' -O - $VAR_D/automated.php - fi - done - iptables -Z - for i in $(./tekbase 24 99 iplist); do iptables -D FORWARD -s $i; iptables -D FORWARD -d $i; done >/dev/null 2>&1 - for i in $(./tekbase 24 99 iplist); do iptables -A FORWARD -s $i; iptables -A FORWARD -d $i; done >/dev/null 2>&1 + for ip in $(./tekbase 24 99 iplist); do + traffic=$(iptables -nvx -L FORWARD | grep " $ip " | tr -s ' ' | cut -d' ' -f3 | awk '{sum+=$1} END {print sum}') + if [ -n "$VAR_E" ]; then + wget --post-data "op=vtraffic&key=$VAR_B&rid=$VAR_E&vip=$ip&traffic=$traffic" -O - "$VAR_D/automated.php" + else + wget --post-data "op=vtraffic&key=$VAR_B&vip=$ip&traffic=$traffic" -O - "$VAR_D/automated.php" + fi + done + iptables -Z + for ip in $(./tekbase 24 99 iplist); do + iptables -D FORWARD -s "$ip" + iptables -D FORWARD -d "$ip" + done >/dev/null 2>&1 + for ip in $(./tekbase 24 99 iplist); do + iptables -A FORWARD -s "$ip" + iptables -A FORWARD -d "$ip" + done >/dev/null 2>&1 fi if [ "$VAR_C" = "iplist" ]; then - vzlist -H -o ip + vzlist -H -o ip fi ;; - # Change files + # File permission adjustments 28) if [ "$VAR_F" = "startscr" ]; then - cd /home/$VAR_B/$VAR_C/$VAR_D - for LINE in $(echo "$VAR_E" | sed -e 's/;/\n/g') - do - chmod 777 $LINE - if [ -d $LINE ]; then - cd $LINE - chmod 544 * - cd /home/$VAR_B/$VAR_C/$VAR_D - fi + cd /home/"$VAR_B"/"$VAR_C"/"$VAR_D" || exit + for LINE in $(echo "$VAR_E" | tr ';' '\n'); do + chmod 777 "$LINE" + if [ -d "$LINE" ]; then + cd "$LINE" && chmod 544 * && cd - >/dev/null + fi done else - newvar="startscr" - screen -A -m -d -S $VAR_B$VAR_D-28 ./tekbase 28 $VAR_B $VAR_C $VAR_D $VAR_E $newvar + screen -A -m -d -S "${VAR_B}${VAR_D}-28" ./tekbase 28 "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "startscr" fi ;; - # Copy files + + # Copy and protect files 29) if [ "$VAR_F" = "startscr" ]; then - cd $LOGP/cache - mkdir -p $VAR_B$VAR_D - chmod 0777 $VAR_B$VAR_D - cd /home/$VAR_B/$VAR_C/$VAR_D - for LINE in $(echo "${VAR_E//;/$'\n'}") - do - if [ -d $LINE ]; then - cp -r --parents $LINE $LOGP/cache/$VAR_B$VAR_D - fi - if [ -f $LINE ]; then - cp --parents $LINE $LOGP/cache/$VAR_B$VAR_D + cd "$LOGP/cache" || exit + mkdir -p "${VAR_B}${VAR_D}" + chmod 0777 "${VAR_B}${VAR_D}" + cd "/home/$VAR_B/$VAR_C/$VAR_D" || exit + while IFS= read -r LINE; do + if [ -d "$LINE" ]; then + cp -r --parents "$LINE" "$LOGP/cache/${VAR_B}${VAR_D}" + elif [ -f "$LINE" ]; then + cp --parents "$LINE" "$LOGP/cache/${VAR_B}${VAR_D}" fi - done - cd $LOGP/cache/$VAR_B$VAR_D - rm protect.md5 - cd $LOGP/cache - tar -cf $VAR_B$VAR_D.tar $VAR_B$VAR_D - md5sum $VAR_B$VAR_D.tar | awk '{print $1}' > $LOGP/cache/$VAR_B$VAR_D/protect.md5 - rm $VAR_B$VAR_D.tar - cd $LOGP/cache/$VAR_B$VAR_D - cp protect.md5 /home/$VAR_B/$VAR_C/$VAR_D/protect.md5 + done <<< "$(echo "$VAR_E" | tr ';' '\n')" + cd "$LOGP/cache/${VAR_B}${VAR_D}" || exit + rm -f protect.md5 + cd "$LOGP/cache" || exit + tar -cf "${VAR_B}${VAR_D}.tar" "${VAR_B}${VAR_D}" + md5sum "${VAR_B}${VAR_D}.tar" | awk '{print $1}' > "${LOGP}/cache/${VAR_B}${VAR_D}/protect.md5" + rm -f "${VAR_B}${VAR_D}.tar" + cp "${LOGP}/cache/${VAR_B}${VAR_D}/protect.md5" "/home/$VAR_B/$VAR_C/$VAR_D/" else - newvar="startscr" - screen -A -m -d -S $VAR_B$VAR_D-29 ./tekbase 29 $VAR_B $VAR_C $VAR_D $VAR_E $newvar + screen -A -m -d -S "${VAR_B}${VAR_D}-29" ./tekbase 29 "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "startscr" fi ;; - # Check MD5 + + # MD5 verification of protected files 30) - dowmd5=$(cat $LOGP/cache/$VAR_B$VAR_D/protect.md5 | awk '{print $1}') - chkmd5=$(cat /home/$VAR_B/$VAR_C/$VAR_D/protect.md5 | awk '{print $1}') - if [ "$dowmd5" = "$chkmd5" ]; then - echo "ID1" - else - echo "ID2" - fi + dowmd5=$(awk '{print $1}' "$LOGP/cache/${VAR_B}${VAR_D}/protect.md5") + chkmd5=$(awk '{print $1}' "/home/$VAR_B/$VAR_C/$VAR_D/protect.md5") + [ "$dowmd5" = "$chkmd5" ] && echo "ID1" || echo "ID2" ;; - # Check Limit - 31) - cd /home/$VAR_B/$VAR_C - - if [ "$VAR_D" != "" ]; then - cd /home/$VAR_B/$VAR_D - fi - if [ "$VAR_E" != "" ]; then - cd /home/$VAR_B/$VAR_E - fi - if [ "$VAR_F" != "" ]; then - cd /home/$VAR_B/$VAR_F - fi - echo "$(du -s | awk '{print $1}')" + # Check disk usage for folder + 31) + target="/home/$VAR_B" + [ -n "$VAR_C" ] && target="$target/$VAR_C" + [ -n "$VAR_D" ] && target="/home/$VAR_B/$VAR_D" + [ -n "$VAR_E" ] && target="/home/$VAR_B/$VAR_E" + [ -n "$VAR_F" ] && target="/home/$VAR_B/$VAR_F" + du -s "$target" | awk '{print $1}' ;; + + # List running processes 32) - echo "$(ps aux --sort pid | grep -v "ps aux" | grep -v "awk {printf" | grep -v "tekbase" | grep -v "perl -e use MIME::Base64" | awk '{printf($1"%TD%") - printf($2"%TD%") - printf($3"%TD%") - printf($4"%TD%") - for (i=11;i<=NF;i++) { - printf("%s ", $i); - } - print("%TEND%") }')" + ps aux --sort pid | grep -v "ps aux" | grep -v "awk {printf" | grep -v "tekbase" | grep -v "perl -e use MIME::Base64" | awk '{ + printf($1"%TD%") + printf($2"%TD%") + printf($3"%TD%") + printf($4"%TD%") + for (i=11;i<=NF;i++) { + printf("%s ", $i) + } + print "%TEND%" + }' ;; + + # Rebind chroot & execute tekbase inside 33) - killall -w -q -u $VAR_B - home=$(grep $VAR_B /etc/passwd | cut -f 6 -d ":") - rsync -a --link-dest=/home/chroot/ /home/chroot/ $home/ - grep $VAR_B /etc/passwd >> $home/etc/passwd - grep $VAR_B /etc/shadow >> $home/etc/shadow - cp /home/skripte/tekbase $home/ - chown $VAR_B $home - mkdir -p $home/proc - umount $home/proc >/dev/null 2>&1 - umount $home/dev >/dev/null 2>&1 - mount proc -t proc $home/proc >/dev/null 2>&1 - mount --bind /dev $home/dev - rm -rf $home$home - mkdir -p $home$home - rmdir $home$home - ln -s / $home$home - chroot $home su $VAR_B -c "./tekbase 9 '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G' '$VAR_H' '$VAR_I' '$VAR_J'" - echo "su $VAR_B -c \"./tekbase 9 '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G' '$VAR_H' '$VAR_I' '$VAR_J'\"" >> $LOGP/logs/tekbase2 + killall -w -q -u "$VAR_B" + home=$(grep "$VAR_B" /etc/passwd | cut -d ":" -f6) + rsync -a --link-dest=/home/chroot/ /home/chroot/ "$home/" + grep "$VAR_B" /etc/passwd >> "$home/etc/passwd" + grep "$VAR_B" /etc/shadow >> "$home/etc/shadow" + cp /home/skripte/tekbase "$home/" + chown "$VAR_B" "$home" + mkdir -p "$home/proc" + umount "$home/proc" >/dev/null 2>&1 + umount "$home/dev" >/dev/null 2>&1 + mount proc -t proc "$home/proc" >/dev/null 2>&1 + mount --bind /dev "$home/dev" + rm -rf "$home$home" + mkdir -p "$home$home" + rmdir "$home$home" + ln -s / "$home$home" + chroot "$home" su "$VAR_B" -c "./tekbase 9 '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G' '$VAR_H' '$VAR_I' '$VAR_J'" + echo "su $VAR_B -c \"./tekbase 9 '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G' '$VAR_H' '$VAR_I' '$VAR_J'\"" >> "$LOGP/logs/tekbase2" ;; + + # List Apache processes 34) - ps aux | grep -i apache | awk '{printf ($1"%TD%); - for(i=11;i<=NF;i++) { - printf("%s ", $i); - } - printf("\n") }' + ps aux | grep -i apache | awk '{ + printf($1"%TD%") + for (i=11;i<=NF;i++) { + printf("%s ", $i) + } + print "" + }' ;; + + # Report disk usage (soft quota) 35) - cd /home - for MEMBER in $(ls -d */ | sed 's#/##') - do - if [ -d $MEMBER/$VAR_B ]; then - cd /home/$MEMBER/$VAR_B - for SERVER in $(ls -d */ | sed 's#/##') - do - quota=$(du -s | awk '{print $1}') - wget --post-data 'op=softlimit&key='$VAR_C'&member='$MEMBER'&typ='$VAR_B'&path='$SERVER'"a='$quota'' -O - $VAR_D/automated.php - done - cd /home - fi - done + cd /home || exit + for MEMBER in */; do + MEMBER=${MEMBER%/} + if [ -d "$MEMBER/$VAR_B" ]; then + cd "/home/$MEMBER/$VAR_B" || continue + for SERVER in */; do + SERVER=${SERVER%/} + quota=$(du -s | awk '{print $1}') + wget --post-data "op=softlimit&key=$VAR_C&member=$MEMBER&typ=$VAR_B&path=$SERVER"a=$quota" -O - "$VAR_D/automated.php" + done + fi + done ;; esac - -exit 0 +exit 0 \ No newline at end of file diff --git a/voices.sh b/voices.sh index 63b2a05..a8ff96a 100755 --- a/voices.sh +++ b/voices.sh @@ -1,238 +1,203 @@ -#! /bin/bash - -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: www.teklab.de -# www.teklab.us - -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 -VAR_H=$8 -VAR_I=$9 -VAR_J=${10} - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi - +#!/bin/bash + +# TekLabs TekBase - Voice Server Management Script (Mumble, Ventrilo, TS2) +# Maintainer: Christian Frankenstein (TekLab) +# Website: www.teklab.de / www.teklab.us + +VAR_A="$1" # Action +VAR_B="$2" # User +VAR_C="$3" # Server ID +VAR_D="$4" # Directory (e.g. ts2, mumble) +VAR_E="$5" # Type: mumble/ventrilo +VAR_F="$6" # Port +VAR_G="$7" # Max Clients or user name +VAR_H="$8" # Host or password +VAR_I="$9" # Bandwidth or admin level +VAR_J="${10}" # Optional + +# Standard paths +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) +LOGFILE="$LOGP/logs/$LOGF.txt" +RESTART_PATH="$LOGP/restart" +VOICE_PATH="/home/$VAR_B/voice/$VAR_D" -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi +mkdir -p "$LOGP/logs" "$RESTART_PATH" +chmod 0777 "$LOGP/logs" "$RESTART_PATH" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} + +[ -z "$VAR_A" ] && ./tekbase && exit 0 +# ------------------ +# START SERVER +# ------------------ if [ "$VAR_A" = "start" ]; then - if [ -f $LOGP/restart/$VAR_B-voice-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-voice-$VAR_C - fi - echo "#! /bin/bash" >> $LOGP/restart/$VAR_B-voice-$VAR_C - if [ "$VAR_F" = "ventrilo" ]; then - echo "check=\`ps aux | grep -v grep | grep -i screen | grep -i \"voice$VAR_C-X\"\`" >> $LOGP/restart/$VAR_B-voice-$VAR_C - fi - if [ "$VAR_F" = "mumble" ]; then - echo "if [ -f /home/$VAR_B/voice/$VAR_C/murmur.pid ]; then" >> $LOGP/restart/$VAR_B-voice-$VAR_C - echo "check=\`ps -p \`cat /home/$VAR_B/voice/$VAR_C/murmurd.pid\`\`" >> $LOGP/restart/$VAR_B-voice-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-voice-$VAR_C - fi - echo "if [ ! -n \"\$check\" ]; then" >> $LOGP/restart/$VAR_B-voice-$VAR_C - echo "cd $LOGP;sudo -u $VAR_B ./voices 'start' '$VAR_B' '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G' '$VAR_H' '$VAR_I' '$VAR_J'" >> $LOGP/restart/$VAR_B-voice-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-voice-$VAR_C - echo "exit 0" >> $LOGP/restart/$VAR_B-voice-$VAR_C - chmod 0755 $LOGP/restart/$VAR_B-voice-$VAR_C + restart_file="$RESTART_PATH/$VAR_B-voice-$VAR_C" + [ -f "$restart_file" ] && rm -f "$restart_file" + + { + echo "#!/bin/bash" + echo "check=\"\"" + if [ "$VAR_E" = "ventrilo" ]; then + echo "check=\$(pgrep -f \"screen.*voice$VAR_C-X\")" + elif [ "$VAR_E" = "mumble" ]; then + echo "if [ -f \"$VOICE_PATH/murmurd.pid\" ]; then" + echo " check=\$(ps -p \$(cat \"$VOICE_PATH/murmurd.pid\"))" + echo "fi" + fi + echo "if [ -z \"\$check\" ]; then" + echo " cd \"$LOGP\" && sudo -u \"$VAR_B\" ./voices.sh start \"$VAR_B\" \"$VAR_C\" \"$VAR_D\" \"$VAR_E\" \"$VAR_F\" \"$VAR_G\" \"$VAR_H\" \"$VAR_I\" \"$VAR_J\"" + echo "fi" + echo "exit 0" + } > "$restart_file" + chmod 0755 "$restart_file" - cd /home/$VAR_B/voice/$VAR_D + cd "$VOICE_PATH" || exit 1 if [ "$VAR_E" = "mumble" ]; then - if [ -f murmurd.pid ]; then - check=$(ps -p $(grep -i "mumble" murmurd.pid)) - if [ -n "$check" ]; then - kill -9 $(cat murmurd.pid) - fi - check=$(ps -p $(grep -i "mumble" murmurd.pid)) - rm murmurd.pid - fi - if [ ! -n "$check" ]; then - sed -i '/port=/Ic\port='$VAR_F'' mumble-server.ini - sed -i '/users=/Ic\users='$VAR_G'' mumble-server.ini - sed -i '/host=/Ic\host='$VAR_H'' mumble-server.ini - sed -i '/bandwidth=/Ic\bandwidth='$VAR_I'' mumble-server.ini - - ./mumble-server -ini mumble-server.ini - sleep 2 - - if [ -f murmurd.pid ]; then - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D was started (./mumble-server -ini mumble-server.ini)" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D cant be started (./mumble-server -ini mumble-server.ini)" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi - else - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D cant be stopped and restarted (./mumble-server -ini mumble-server.ini)" >> $LOGP/logs/$LOGF.txt - echo "ID3" - fi - fi - if [ "$VAR_E" = "ventrilo" ]; then - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "voice$VAR_C-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "voice$VAR_C-X") - screen -wipe - if [ ! -n "$check" ]; then - sed -i '/Port=/Ic\Port='$VAR_F'' ventrilo_srv.ini - sed -i '/MaxClients=/Ic\MaxClients='$VAR_G'' ventrilo_srv.ini - - screen -A -m -d -S voice$VAR_B-X ./ventrilo_srv - check=$(ps aux | grep -v grep | grep -i screen | grep -i "voice$VAR_C-X") + [ -f murmurd.pid ] && kill -9 "$(cat murmurd.pid)" 2>/dev/null && rm -f murmurd.pid + sed -i "s/^port=.*/port=$VAR_F/" mumble-server.ini + sed -i "s/^users=.*/users=$VAR_G/" mumble-server.ini + sed -i "s/^host=.*/host=$VAR_H/" mumble-server.ini + sed -i "s/^bandwidth=.*/bandwidth=$VAR_I/" mumble-server.ini + ./mumble-server -ini mumble-server.ini & + sleep 2 + if [ -f murmurd.pid ]; then + log_msg "Mumble started at $VOICE_PATH" + echo "ID1" + else + log_msg "Mumble failed to start at $VOICE_PATH" + echo "ID2" + fi - if [ -n "$check" ]; then - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D was started (./ventrilo_srv)" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D cant be started (./ventrilo_srv)" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi - else - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D cant be stopped and restarted (./ventrilo_srv)" >> $LOGP/logs/$LOGF.txt - echo "ID3" - fi + elif [ "$VAR_E" = "ventrilo" ]; then + pkill -f "screen.*voice$VAR_C-X" + screen -wipe + screen -A -m -d -S "voice$VAR_C-X" ./ventrilo_srv + sleep 2 + if pgrep -f "screen.*voice$VAR_C-X" > /dev/null; then + log_msg "Ventrilo started at $VOICE_PATH" + echo "ID1" + else + log_msg "Ventrilo failed to start at $VOICE_PATH" + echo "ID2" + fi fi fi +# ------------------ +# STOP SERVER +# ------------------ if [ "$VAR_A" = "stop" ]; then - if [ -f $LOGP/restart/$VAR_B-voice-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-voice-$VAR_C - fi + restart_file="$RESTART_PATH/$VAR_B-voice-$VAR_C" + [ -f "$restart_file" ] && rm -f "$restart_file" - cd /home/$VAR_B/voice/$VAR_D + cd "$VOICE_PATH" || exit 1 if [ "$VAR_E" = "mumble" ]; then - if [ -f murmurd.pid ]; then - check=$(ps -p $(grep -i "mumble" murmurd.pid)) - if [ -n "$check" ]; then - kill -9 $(cat murmurd.pid) - fi - check=$(ps -p $(grep -i "mumble" murmurd.pid)) - rm murmurd.pid - fi - fi - if [ "$VAR_E" = "ventrilo" ]; then - if [ "$VAR_C" = "vstreams" ]; then - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "voice$VAR_C-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "voice$VAR_C-X") - screen -wipe - fi + [ -f murmurd.pid ] && kill -9 "$(cat murmurd.pid)" 2>/dev/null && rm -f murmurd.pid + elif [ "$VAR_E" = "ventrilo" ]; then + pkill -f "screen.*voice$VAR_C-X" + screen -wipe fi - if [ ! -n "$check" ]; then - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D was stopped" >> $LOGP/logs/$LOGF.txt - echo "ID1" + if ! pgrep -f "screen.*voice$VAR_C-X" > /dev/null; then + log_msg "Voice server stopped at $VOICE_PATH" + echo "ID1" else - echo "$(date) - Voice /home/$VAR_B/voice/$VAR_D cant be stopped" >> $LOGP/logs/$LOGF.txt - echo "ID2" + log_msg "Voice server failed to stop at $VOICE_PATH" + echo "ID2" fi fi - +# ------------------ +# MUMBLE USER MANAGEMENT +# ------------------ if [ "$VAR_A" = "muserlist" ]; then - cd /home/$VAR_B/voice/$VAR_D - userlist=$(sqlite3 -html mumble-server.sqlite "SELECT user_id, name FROM users ORDER BY name ASC") - echo "$userlist" -fi + cd "$VOICE_PATH" || exit 1 + sqlite3 -html mumble-server.sqlite "SELECT user_id, name FROM users ORDER BY name ASC" -if [ "$VAR_A" = "museradd" ]; then - cd /home/$VAR_B/voice/$VAR_D - password=$(echo -n $VAR_F | sha1sum | awk '{print $1}') +elif [ "$VAR_A" = "museradd" ]; then + cd "$VOICE_PATH" || exit 1 + password=$(echo -n "$VAR_F" | sha1sum | awk '{print $1}') usercount=$(sqlite3 mumble-server.sqlite "SELECT user_id FROM users ORDER BY user_id DESC LIMIT 1") - let newid=$usercount+1 + ((newid=usercount+1)) sqlite3 mumble-server.sqlite "INSERT INTO users (server_id, user_id, name, pw) VALUES (1, \"$newid\", \"$VAR_E\", \"$password\")" echo "ID1" -fi -if [ "$VAR_A" = "musermod" ]; then - cd /home/$VAR_B/voice/$VAR_D - password=$(echo -n $VAR_E | sha1sum |awk '{print $1}') +elif [ "$VAR_A" = "musermod" ]; then + cd "$VOICE_PATH" || exit 1 + password=$(echo -n "$VAR_E" | sha1sum | awk '{print $1}') sqlite3 mumble-server.sqlite "UPDATE users SET pw=\"$password\" WHERE user_id=\"$VAR_F\"" echo "ID1" -fi -if [ "$VAR_A" = "muserdel" ]; then - cd /home/$VAR_B/voice/$VAR_D +elif [ "$VAR_A" = "muserdel" ]; then + cd "$VOICE_PATH" || exit 1 sqlite3 mumble-server.sqlite "DELETE FROM users WHERE user_id=\"$VAR_E\"" echo "ID1" fi +# ------------------ +# TS2 USER MANAGEMENT +# ------------------ +TSDB_PATH="/home/user-webi/$VAR_D" + if [ "$VAR_A" = "tuserlist" ]; then - cd /home/user-webi/$VAR_D + cd "$TSDB_PATH" || exit 1 serverid=$(sqlite server.dbs "SELECT i_server_id FROM ts2_servers WHERE i_server_udpport=\"$VAR_F\"") userlist=$(sqlite -html server.dbs "SELECT i_client_id, s_client_name, b_client_privilege_serveradmin FROM ts2_clients WHERE i_client_server_id=\"$serverid\" ORDER BY s_client_name ASC") - userlist=$(echo ${userlist//&/_}) - tscounter=0 - tsnewline="" - for LINE in $userlist - do - if [ "$tscounter" != "4" ]; then - tsnewline="$tsnewline$LINE" - let tscounter=$tscounter+1 - fi - if [ "$tscounter" = "4" ]; then - echo "$tsnewline%TEK%" - tsnewline="" - tscounter=0 - fi + userlist=$(echo "${userlist//&/_}") + counter=0 + line="" + for entry in $userlist; do + line="$line$entry" + ((counter++)) + if [ $counter -eq 4 ]; then + echo "$line%TEK%" + counter=0 + line="" + fi done -fi -if [ "$VAR_A" = "tuseradd" ]; then - cd /home/user-webi/$VAR_D +elif [ "$VAR_A" = "tuseradd" ]; then + cd "$TSDB_PATH" || exit 1 adddate="$(date +"%d%m%Y%H%M%S")00000" serverid=$(sqlite server.dbs "SELECT i_server_id FROM ts2_servers WHERE i_server_udpport=\"$VAR_F\"") sqlite server.dbs "INSERT INTO ts2_clients (i_client_server_id, b_client_privilege_serveradmin, s_client_name, s_client_password, dt_client_created) VALUES (\"$serverid\", \"$VAR_I\", \"$VAR_G\", \"$VAR_H\", \"$adddate\")" echo "ID1" -fi -if [ "$VAR_A" = "tusermod" ]; then - cd /home/user-webi/$VAR_D +elif [ "$VAR_A" = "tusermod" ]; then + cd "$TSDB_PATH" || exit 1 serverid=$(sqlite server.dbs "SELECT i_server_id FROM ts2_servers WHERE i_server_udpport=\"$VAR_F\"") sqlite server.dbs "UPDATE ts2_clients SET b_client_privilege_serveradmin=\"$VAR_I\", s_client_password=\"$VAR_H\" WHERE i_client_id=\"$VAR_G\" AND i_client_server_id=\"$serverid\"" echo "ID1" -fi -if [ "$VAR_A" = "tuserdel" ]; then - cd /home/user-webi/$VAR_D +elif [ "$VAR_A" = "tuserdel" ]; then + cd "$TSDB_PATH" || exit 1 serverid=$(sqlite server.dbs "SELECT i_server_id FROM ts2_servers WHERE i_server_udpport=\"$VAR_F\"") sqlite server.dbs "DELETE FROM ts2_clients WHERE i_client_id=\"$VAR_G\" AND i_client_server_id=\"$serverid\"" echo "ID1" fi +# ------------------ +# TS2 SERVER MANAGEMENT +# ------------------ if [ "$VAR_A" = "tserverchg" ]; then - cd /home/user-webi/$VAR_D + cd "$TSDB_PATH" || exit 1 sqlite server.dbs "UPDATE ts2_servers SET i_server_maxusers=\"$VAR_H\", i_server_udpport=\"$VAR_G\" WHERE i_server_udpport=\"$VAR_F\"" echo "ID1" -fi -if [ "$VAR_A" = "tservermod" ]; then - cd /home/user-webi/$VAR_D +elif [ "$VAR_A" = "tservermod" ]; then + cd "$TSDB_PATH" || exit 1 sqlite server.dbs "UPDATE ts2_servers SET s_server_name=\"$VAR_C\", s_server_welcomemessage=\"$VAR_E\", s_server_password=\"$VAR_G\", b_server_clan_server=\"$VAR_H\", s_server_webposturl=\"$VAR_I\", s_server_weblinkurl=\"$VAR_J\" WHERE i_server_udpport=\"$VAR_F\"" echo "ID1" -fi -if [ "$VAR_A" = "tserverdel" ]; then - cd /home/user-webi/$VAR_D +elif [ "$VAR_A" = "tserverdel" ]; then + cd "$TSDB_PATH" || exit 1 serverid=$(sqlite server.dbs "SELECT i_server_id FROM ts2_servers WHERE i_server_udpport=\"$VAR_F\"") sqlite server.dbs "DELETE FROM ts2_server_privileges WHERE i_sp_server_id=\"$serverid\"" sqlite server.dbs "DELETE FROM ts2_channels WHERE i_channel_server_id=\"$serverid\"" @@ -241,49 +206,42 @@ if [ "$VAR_A" = "tserverdel" ]; then sqlite server.dbs "DELETE FROM ts2_bans WHERE i_ban_server_id=\"$serverid\"" sqlite server.dbs "DELETE FROM ts2_servers WHERE i_server_id=\"$serverid\"" echo "ID1" -fi -if [ "$VAR_A" = "tserverread" ]; then - cd /home/user-webi/$VAR_D - serverid=$(sqlite -separator %TD% server.dbs "SELECT s_server_name, s_server_welcomemessage, s_server_password, b_server_clan_server, s_server_webposturl, s_server_weblinkurl FROM ts2_servers WHERE i_server_udpport=\"$VAR_F\"") - echo "$serverid" -fi - -if [ "$VAR_A" = "content" ]; then - cd /home/$VAR_B/voice/$VAR_D - check=$(cat $VAR_E) - for LINE in $check - do - echo "$LINE%TEND%" - done +elif [ "$VAR_A" = "tserverread" ]; then + cd "$TSDB_PATH" || exit 1 + result=$(sqlite -separator %TD% server.dbs "SELECT s_server_name, s_server_welcomemessage, s_server_password, b_server_clan_server, s_server_webposturl, s_server_weblinkurl FROM ts2_servers WHERE i_server_udpport=\"$VAR_F\"") + echo "$result" fi +# ------------------ +# TSDNS Update +# ------------------ if [ "$VAR_A" = "tsdns" ]; then - cd /home/tsdns - if [ -f tsdns_settings.ini ]; then - sed -i '/'$VAR_B'/d' tsdns_settings.ini - fi - if [ "$VAR_C" != "" ]; then - echo -e "\n$VAR_C=$VAR_B" >> tsdns_settings.ini - fi - check=$(ps aux | grep -v grep | grep -i "tsdnsserver_linux") - if [ ! -n "$check" ]; then - if [ -f tsdnsserver_linux_86 ]; then - ./tsdnsserver_linux_x86 & - fi - if [ -f tsdnsserver_linux_amd64 ]; then - ./tsdnsserver_linux_amd64 & - fi - else - if [ -f tsdnsserver_linux_x86 ]; then - ./tsdnsserver_linux_x86 --update - fi - if [ -f tsdnsserver_linux_amd64 ]; then - ./tsdnsserver_linux_amd64 --update - fi - fi - echo "ID1" + cd /home/tsdns || exit 1 + [ -f tsdns_settings.ini ] && sed -i "/$VAR_B/d" tsdns_settings.ini + [ -n "$VAR_C" ] && echo "$VAR_C=$VAR_B" >> tsdns_settings.ini + if ! pgrep -f "tsdnsserver_linux" > /dev/null; then + [ -f tsdnsserver_linux_amd64 ] && ./tsdnsserver_linux_amd64 & + [ -f tsdnsserver_linux_x86 ] && ./tsdnsserver_linux_x86 & + else + [ -f tsdnsserver_linux_amd64 ] && ./tsdnsserver_linux_amd64 --update + [ -f tsdnsserver_linux_x86 ] && ./tsdnsserver_linux_x86 --update + fi + echo "ID1" fi +# ------------------ +# Generic content dump +# ------------------ +if [ "$VAR_A" = "content" ]; then + cd "/home/$VAR_B/voice/$VAR_D" || exit 1 + if [ -f "$VAR_E" ]; then + while IFS= read -r LINE; do + echo "$LINE%TEND%" + done < "$VAR_E" + else + echo "File not found: $VAR_E" + fi +fi -exit 0 +exit 0 \ No newline at end of file diff --git a/vstreams.sh b/vstreams.sh index 5ec149e..1054a02 100755 --- a/vstreams.sh +++ b/vstreams.sh @@ -1,126 +1,141 @@ -#! /bin/bash - -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net - -VAR_A=$1 -VAR_B=$2 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 -VAR_F=$6 -VAR_G=$7 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi - +#!/bin/bash + +# TekLabs TekBase - Video Streams Controller Script (Screen + Docker) +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net + +VAR_A="$1" # Action +VAR_B="$2" # User +VAR_C="$3" # Stream ID +VAR_D="$4" # Path +VAR_E="$5" # App name OR Docker container name +VAR_F="$6" # Start script (for screen) +VAR_G="$7" # Base port + +# Setup logging +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) +LOGFILE="$LOGP/logs/$LOGF.txt" +RESTART_PATH="$LOGP/restart" -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi +mkdir -p "$LOGP/logs" "$RESTART_PATH" +chmod 0777 "$LOGP/logs" "$RESTART_PATH" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} -#VAR_A typ -#VAR_B USER -#VAR_C ID -#VAR_D PATH -#VAR_E APP -#VAR_F STARTSCRIPT -#VAR_G PORT +is_docker() { + [[ "$VAR_E" == docker-* ]] +} + +get_container_name() { + echo "${VAR_E#docker-}" +} + +[ -z "$VAR_A" ] && ./tekbase && exit 0 if [ "$VAR_A" = "start" ]; then - if [ -f $LOGP/restart/$VAR_B-vstreams-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-vstreams-$VAR_C - fi - echo "#! /bin/bash" >> $LOGP/restart/$VAR_B-vstreams-$VAR_C - echo "check=\`ps aux | grep -v grep | grep -i screen | grep -i \"vstreams$VAR_C-X\"\`" >> $LOGP/restart/$VAR_B-server-$VAR_C - echo "if [ ! -n \"\$check\" ]; then" >> $LOGP/restart/$VAR_B-vstreams-$VAR_C - echo "cd $LOGP;sudo -u $VAR_B ./vstreams 'start' '$VAR_B' '$VAR_C' '$VAR_D' '$VAR_E' '$VAR_F' '$VAR_G'" >> $LOGP/restart/$VAR_B-vstreams-$VAR_C - echo "fi" >> $LOGP/restart/$VAR_B-vstreams-$VAR_C - echo "exit 0" >> $LOGP/restart/$VAR_B-vstreams-$VAR_C - chmod 0755 $LOGP/restart/$VAR_B-vstreams-$VAR_C - - cd /home/$VAR_B/vstreams/$VAR_D - - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_F$VAR_B-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "$VAR_F$VAR_B-X") - screen -wipe - if [ ! -n "$check" ]; then - let httpp=$VAR_G+40 - let httpsp=$VAR_G+30 - let rtmptp=$VAR_G+20 - let mrtmpp=$VAR_G+10 - let proxyp=$VAR_G+1 - cd conf - sed -e '/http.port=/Ic\http.port='$httpp'' red5.properties > red5.backup - sed -e '/rtmp.port=/Ic\rtmp.port='$VAR_G'' red5.backup > red5.properties - sed -e '/rtmpt.port=/Ic\rtmpt.port='$rtmptp'' red5.properties > red5.backup - sed -e '/mrtmp.port=/Ic\mrtmpp.port='$mrtmpp'' red5.backup > red5.properties - sed -e '/proxy.source_port=/Ic\proxy.source_port='$proxyp'' red5.properties > red5.backup - sed -e '/proxy.destination_port=/Ic\proxy.destination_port='$VAR_G'' red5.backup > red5.properties - sed -e '/https.port=/Ic\https.port='$httpsp'' red5.properties > red5.backup - rm red5.properties - mv red5.backup red5.properties - cd /home/$VAR_C/vstreams/$VAR_D - - screen -A -m -d -S vstreams$VAR_C-X $VAR_F - check=$(ps aux | grep -v grep | grep -i screen | grep -i "vstreams$VAR_C-X") - - if [ -n "$check" ]; then - echo "$(date) - Stream /home/$VAR_B/vstreams/$VAR_D was started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID1" - else - echo "$(date) - Stream /home/$VAR_B/vstreams/$VAR_D cant be started ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID2" - fi + restart_script="$RESTART_PATH/$VAR_B-vstreams-$VAR_C" + rm -f "$restart_script" + + cat < "$restart_script" +#!/bin/bash +$(is_docker && echo "check=\$(docker ps | grep -i \$(get_container_name))" || echo "check=\$(pgrep -f \"screen.*vstreams$VAR_C-X\")") +if [ -z "\$check" ]; then + cd "$LOGP" + sudo -u "$VAR_B" ./vstreams start "$VAR_B" "$VAR_C" "$VAR_D" "$VAR_E" "$VAR_F" "$VAR_G" +fi +exit 0 +EOF + chmod 0755 "$restart_script" + + if is_docker; then + container=$(get_container_name) + docker start "$container" + sleep 2 + if docker ps | grep -q "$container"; then + log_msg "Docker stream container '$container' was started" + echo "ID1" + else + log_msg "Docker stream container '$container' failed to start" + echo "ID2" + fi else - echo "$(date) - Stream /home/$VAR_B/vstreams/$VAR_D cant be stopped and restarted ($VAR_F)" >> $LOGP/logs/$LOGF.txt - echo "ID3" + cd "/home/$VAR_B/vstreams/$VAR_D" || exit 1 + pkill -f "screen.*$VAR_F$VAR_B-X" + screen -wipe + + if ! pgrep -f "screen.*$VAR_F$VAR_B-X" > /dev/null; then + let httpp=VAR_G+40 + let httpsp=VAR_G+30 + let rtmptp=VAR_G+20 + let mrtmpp=VAR_G+10 + let proxyp=VAR_G+1 + + cd conf || exit 1 + sed -i.bak -e "s/^http.port=.*/http.port=$httpp/" \ + -e "s/^rtmp.port=.*/rtmp.port=$VAR_G/" \ + -e "s/^rtmpt.port=.*/rtmpt.port=$rtmptp/" \ + -e "s/^mrtmp.port=.*/mrtmp.port=$mrtmpp/" \ + -e "s/^proxy.source_port=.*/proxy.source_port=$proxyp/" \ + -e "s/^proxy.destination_port=.*/proxy.destination_port=$VAR_G/" \ + -e "s/^https.port=.*/https.port=$httpsp/" red5.properties + + cd "/home/$VAR_B/vstreams/$VAR_D" || exit 1 + screen -A -m -d -S "vstreams$VAR_C-X" "$VAR_F" + if pgrep -f "screen.*vstreams$VAR_C-X" > /dev/null; then + log_msg "Screen-based stream /home/$VAR_B/vstreams/$VAR_D was started ($VAR_F)" + echo "ID1" + else + log_msg "Screen-based stream /home/$VAR_B/vstreams/$VAR_D failed to start ($VAR_F)" + echo "ID2" + fi + else + log_msg "Stream already running, could not restart ($VAR_F)" + echo "ID3" + fi fi fi if [ "$VAR_A" = "stop" ]; then - if [ -f $LOGP/restart/$VAR_B-vstreams-$VAR_C ]; then - rm $LOGP/restart/$VAR_B-vstreams-$VAR_C - fi - - kill -9 $(ps aux | grep -v grep | grep -i screen | grep -i "vstreams$VAR_C-X" | awk '{print $2}') - check=$(ps aux | grep -v grep | grep -i screen | grep -i "vstreams$VAR_C-X") - screen -wipe - - if [ ! -n "$check" ]; then - echo "$(date) - Stream /home/$VAR_B/vstreams/$VAR_D was stopped" >> $LOGP/logs/$LOGF.txt - echo "ID1" + rm -f "$RESTART_PATH/$VAR_B-vstreams-$VAR_C" + + if is_docker; then + container=$(get_container_name) + docker stop "$container" + sleep 1 + if ! docker ps | grep -q "$container"; then + log_msg "Docker stream container '$container' was stopped" + echo "ID1" + else + log_msg "Docker stream container '$container' could not be stopped" + echo "ID2" + fi else - echo "$(date) - Stream /home/$VAR_B/vstreams/$VAR_D cant be stopped" >> $LOGP/logs/$LOGF.txt - echo "ID2" + pkill -f "screen.*vstreams$VAR_C-X" + screen -wipe + if ! pgrep -f "screen.*vstreams$VAR_C-X" > /dev/null; then + log_msg "Stream /home/$VAR_B/vstreams/$VAR_D was stopped" + echo "ID1" + else + log_msg "Stream /home/$VAR_B/vstreams/$VAR_D could not be stopped" + echo "ID2" + fi fi fi - if [ "$VAR_A" = "content" ]; then - cd /home/$VAR_B/vstreams/$VAR_D - check=$(cat $VAR_E) - for LINE in $check - do - echo "$LINE%TEND%" - done + cd "/home/$VAR_B/vstreams/$VAR_D" || exit 1 + if [ -f "$VAR_E" ]; then + while IFS= read -r LINE; do + echo "$LINE%TEND%" + done < "$VAR_E" + else + echo "File not found: $VAR_E" + fi fi - -exit 0 +exit 0 \ No newline at end of file diff --git a/web.sh b/web.sh index e61d160..c5e288a 100755 --- a/web.sh +++ b/web.sh @@ -1,147 +1,144 @@ -#! /bin/bash +#!/bin/bash -# TekLabs TekBase -# Copyright since 2005 TekLab -# Christian Frankenstein -# Website: teklab.de -# teklab.net +# TekLabs TekBase - Web and MySQL Control Script +# Maintainer: Christian Frankenstein (TekLab) +# Website: teklab.de / teklab.net -VAR_A=$1 -VAR_C=$3 -VAR_D=$4 -VAR_E=$5 - -if [ "$VAR_A" = "" ]; then - ./tekbase -fi +VAR_A="$1" +VAR_B="$2" +VAR_C="$3" +VAR_D="$4" +VAR_E="$5" +LOGP=$(cd "$(dirname "$0")" && pwd) LOGF=$(date +"%Y_%m") -LOGP=$(pwd) +LOGFILE="$LOGP/logs/$LOGF.txt" +RESTART_PATH="$LOGP/restart" -if [ ! -d logs ]; then - mkdir logs - chmod 0777 logs -fi -if [ ! -d restart ]; then - mkdir restart - chmod 0777 restart -fi +mkdir -p "$LOGP/logs" "$RESTART_PATH" +chmod 0777 "$LOGP/logs" "$RESTART_PATH" +touch "$LOGFILE" +chmod 0666 "$LOGFILE" -if [ ! -f "logs/$LOGF.txt" ]; then - echo "***TekBASE Script Log***" >> $LOGP/logs/$LOGF.txt - chmod 0666 $LOGP/logs/$LOGF.txt -fi +log_msg() { + echo "$(date) - $1" >> "$LOGFILE" +} +[ -z "$VAR_A" ] && ./tekbase && exit 0 +# ----------------------- +# Create MySQL Database +# ----------------------- if [ "$VAR_A" = "dbcreate" ]; then if [ -f /etc/mysql/settings.ini ]; then mysqlpwd=$(grep -i password /etc/mysql/settings.ini | awk '{print $2}') mysqlusr=$(grep -i login /etc/mysql/settings.ini | awk '{print $2}') - Q1="CREATE DATABASE IF NOT EXISTS $VAR_C;" - Q2="CREATE USER '$VAR_D'@'%' IDENTIFIED BY '$VAR_E';" - Q3="GRANT ALL PRIVILEGES ON $VAR_C.* TO '$VAR_D'@'%';" - Q4="FLUSH PRIVILEGES;" - SQL="${Q1}${Q2}${Q3}${Q4}" + SQL="CREATE DATABASE IF NOT EXISTS $VAR_C; + CREATE USER '$VAR_D'@'%' IDENTIFIED BY '$VAR_E'; + GRANT ALL PRIVILEGES ON $VAR_C.* TO '$VAR_D'@'%'; + FLUSH PRIVILEGES;" - mysql --user=$mysqlusr --password=$mysqlpwd -e "$SQL" + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "$SQL" echo "ID1" else echo "ID2" fi fi +# ----------------------- +# Delete MySQL Database +# ----------------------- if [ "$VAR_A" = "dbdelete" ]; then if [ -f /etc/mysql/settings.ini ]; then mysqlpwd=$(grep -i password /etc/mysql/settings.ini | awk '{print $2}') mysqlusr=$(grep -i login /etc/mysql/settings.ini | awk '{print $2}') - Q1="DROP DATABASE $VAR_C;" - Q2="DROP USER $VAR_D@'%';" - Q3="FLUSH PRIVILEGES;" - SQL="${Q1}${Q2}" + SQL="DROP DATABASE IF EXISTS $VAR_C; + DROP USER IF EXISTS '$VAR_D'@'%'; + FLUSH PRIVILEGES;" - mysql --user=$mysqlusr --password=$mysqlpwd -e "$SQL" + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "$SQL" echo "ID1" else - echo "ID2" + echo "ID2" fi fi +# ----------------------- +# Rename MySQL Database +# ----------------------- if [ "$VAR_A" = "dbrename" ]; then if [ -f /etc/mysql/settings.ini ]; then mysqlpwd=$(grep -i password /etc/mysql/settings.ini | awk '{print $2}') mysqlusr=$(grep -i login /etc/mysql/settings.ini | awk '{print $2}') - mysqldump --user=$mysqlusr --password=$mysqlpwd $VAR_C > $VAR_C.sql - Q1="CREATE DATABASE IF NOT EXISTS $VAR_D;" - SQL="${Q1}" - - mysql --user=$mysqlusr --password=$mysqlpwd -e "$SQL" - mysql --user=$mysqlusr --password=$mysqlpwd $VAR_D < $VAR_C.sql - - Q1="GRANT ALL PRIVILEGES ON $VAR_D.* TO '$VAR_E'@'%';" - Q2="REVOKE ALL PRIVILEGES ON $VAR_C.* FROM '$VAR_E'@'%';" - Q3="DROP DATABASE $VAR_C;" - Q4="FLUSH PRIVILEGES;" - SQL="${Q1}${Q2}${Q3}${Q4}" - - mysql --user=$mysqlusr --password=$mysqlpwd -e "$SQL" - rm $VAR_C.sql + mysqldump --user="$mysqlusr" --password="$mysqlpwd" "$VAR_C" > "$VAR_C.sql" + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "CREATE DATABASE IF NOT EXISTS $VAR_D" + mysql --user="$mysqlusr" --password="$mysqlpwd" "$VAR_D" < "$VAR_C.sql" + + SQL="GRANT ALL PRIVILEGES ON $VAR_D.* TO '$VAR_E'@'%'; + REVOKE ALL PRIVILEGES ON $VAR_C.* FROM '$VAR_E'@'%'; + DROP DATABASE $VAR_C; + FLUSH PRIVILEGES;" + + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "$SQL" + rm -f "$VAR_C.sql" echo "ID1" else - echo "ID2" + echo "ID2" fi fi +# ----------------------- +# Change MySQL Password +# ----------------------- if [ "$VAR_A" = "dbpasswd" ]; then if [ -f /etc/mysql/settings.ini ]; then mysqlpwd=$(grep -i password /etc/mysql/settings.ini | awk '{print $2}') mysqlusr=$(grep -i login /etc/mysql/settings.ini | awk '{print $2}') - Q1="SET PASSWORD FOR '$VAR_C'@'%' = PASSWORD('$VAR_D');" - Q2="FLUSH PRIVILEGES;" - SQL="${Q1}${Q2}" + SQL="ALTER USER '$VAR_C'@'%' IDENTIFIED BY '$VAR_D'; + FLUSH PRIVILEGES;" - mysql --user=$mysqlusr --password=$mysqlpwd -e "$SQL" + mysql --user="$mysqlusr" --password="$mysqlpwd" -e "$SQL" echo "ID1" else - echo "ID2" + echo "ID2" fi fi +# ----------------------- +# Apache VHost Management +# ----------------------- if [ "$VAR_A" = "activate" ]; then - if [ -f includes/sites/$VAR_B.conf ]; then - cp includes/sites/$VAR_B.conf /etc/apache2/sites-enabled - echo "ID1" + if [ -f "$LOGP/includes/sites/$VAR_B.conf" ]; then + cp "$LOGP/includes/sites/$VAR_B.conf" /etc/apache2/sites-enabled/ + echo "ID1" else - echo "ID2" + echo "ID2" fi fi if [ "$VAR_A" = "deactivate" ]; then - if [ -f /etc/apache2/sites-enabled/$VAR_B.conf ]; then - rm /etc/apache2/sites-enabled/$VAR_B.conf - echo "ID1" + if [ -f "/etc/apache2/sites-enabled/$VAR_B.conf" ]; then + rm "/etc/apache2/sites-enabled/$VAR_B.conf" + echo "ID1" else - echo "ID2" + echo "ID2" fi fi if [ "$VAR_A" = "delete" ]; then - if [ -f includes/sites/$VAR_B.conf ]; then - rm includes/sites/$VAR_B.conf - if [ -f /etc/apache2/sites-enabled/$VAR_B.conf ]; then - rm /etc/apache2/sites-enabled/$VAR_B.conf - fi - echo "ID1" - else - echo "ID2" - fi + removed="no" + [ -f "$LOGP/includes/sites/$VAR_B.conf" ] && rm "$LOGP/includes/sites/$VAR_B.conf" && removed="yes" + [ -f "/etc/apache2/sites-enabled/$VAR_B.conf" ] && rm "/etc/apache2/sites-enabled/$VAR_B.conf" && removed="yes" + + [ "$removed" = "yes" ] && echo "ID1" || echo "ID2" fi if [ "$VAR_A" = "apache" ]; then - /etc/init.d/apache2 reload + systemctl reload apache2 2>/dev/null || /etc/init.d/apache2 reload echo "ID1" fi