diff --git a/proftpd_settings.cfg b/proftpd_settings.cfg index b794d34..fa3378c 100644 --- a/proftpd_settings.cfg +++ b/proftpd_settings.cfg @@ -1,21 +1,23 @@ - HideFiles (^\..+|\.ssh|\.bash_history|\.bash_logout|\.bashrc|\.profile|srcds_run|srcds_linux|hlds_run|hlds_amd|hlds_i686|\.rc|\.sh|\.7z|\.dll)$ - PathDenyFilter (^\..+|\.ssh|\.bash_history|\.bash_logout|\.bashrc|\.profile|srcds_run|srcds_linux|hlds_run|hlds_amd|hlds_i686|\.rc|\.sh|\.7z|\.dll)$ + HideFiles (^\..+|\.ssh|\.bash_history|\.bash_logout|\.bashrc|\.profile|srcds_run|srcds_linux|hlds_run|hlds_amd|hlds_i686|\.rc|\.7z|\.dll|\.git|\.svn|\.htaccess|\.htpasswd|\.bak)$ + PathDenyFilter (^\..+|\.ssh|\.bash_history|\.bash_logout|\.bashrc|\.profile|srcds_run|srcds_linux|hlds_run|hlds_amd|hlds_i686|\.rc|\.7z|\.dll|\.git|\.svn|\.htaccess|\.htpasswd|\.bak)$ HideNoAccess on - Umask 077 077 + Umask 027 027 DenyAll + - Umask 077 077 - + Umask 022 022 + DenyAll + - Umask 077 077 - + Umask 022 022 + DenyAll - + \ No newline at end of file diff --git a/webinstall.sh b/webinstall.sh index 31ad31c..c2d2bb0 100755 --- a/webinstall.sh +++ b/webinstall.sh @@ -84,34 +84,68 @@ function color { function gen_passwd { PWCHARS=$1 [ "$PWCHARS" = "" ] && PWCHARS=16 - tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${PWCHARS} | xargs + local password=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${PWCHARS} | xargs) + echo "$password" } ############################## -# Generate Logs # +# Advanced Logging Function # ############################## function gen_logs { - log_text=$1 - if [ "$log_text" = "" ]; then - echo "##############################" >> /home/tekbase.log - echo "# TekBASE installation #" >> /home/tekbase.log - echo "##############################" >> /home/tekbase.log - echo "[$(date +"%Y_%m-%H_%M_%S")] - start" >> /home/tekbase.log + local input="$1" + local log_type="${2:-msg}" # default to "msg" + local log_root="/home/tekbase/logs" + local timestamp="[$(date +"%Y-%m-%d %H:%M:%S")]" + local call_origin="$(caller 1)" + + # Ensure log directory exists + mkdir -p "$log_root" + + local log_success_file="$log_root/installed.log" + local log_error_file="$log_root/errors.log" + + # Smarter failure keywords for actual errors + local failure_keywords="fail|could not|error|denied|unable|unreachable|timed out|invalid|broken|exception" + + if [ "$log_type" = "cmd" ]; then + local output + output=$(eval "$input" 2>&1) + local exit_code=$? + + if [ $exit_code -eq 0 ] && ! echo "$output" | grep -iE "$failure_keywords" >/dev/null; then + # Log successful command + { + echo "$timestamp - ✅ Command succeeded: $input" + echo "$timestamp - Output:" + echo "$output" + echo "" + } | tee -a "$log_success_file" + else + # Log failed command + { + echo "$timestamp - ❌ Command failed: $input" + echo " ↳ Exit Code: $exit_code" + echo " ↳ Called from: $call_origin" + echo " ↳ Output:" + echo "$output" + echo "" + } | tee -a "$log_error_file" + fi + elif [ "$log_type" = "msg" ]; then + # Log generic message + if echo "$input" | grep -iE "$failure_keywords" >/dev/null; then + # Log as error if message contains failure keywords + echo "$timestamp - ⚠️ $input (from: $call_origin)" | tee -a "$log_error_file" + else + # Log as regular success message + echo "$timestamp - $input" | tee -a "$log_success_file" + fi else - if [ "$2" != "" ]; then - pkg_check=$(dpkg-query -W --showformat='${Status}\n' $2|grep "install ok installed") - if [ "$check" == "install ok installed" ]; then - log_text="The Package ${2} is installed." - else - log_text="The Package ${2} could not be installed." - fi - fi - echo "[$(date +"%Y_%m-%H_%M_%S")] - ${log_text}" >> /home/tekbase.log + # Unknown log type - treat as warning + echo "$timestamp - ⚠️ Unknown log type '$log_type'. Message: $input (from: $call_origin)" | tee -a "$log_error_file" fi } - - ############################## # Loading Spinner # ############################## @@ -131,8 +165,11 @@ function loading { # Create Directory # ############################## function make_dir { - if [ "$1" != "" -a ! -d $1 ]; then - mkdir -p $1 + if [ -n "$1" ] && [ ! -d "$1" ]; then + mkdir -p "$1" + gen_logs "Created directory: $1" msg + else + gen_logs "Directory already exists or path was empty: $1" msg fi } @@ -149,12 +186,18 @@ function chk_apache { checkd=$(find /usr/include -name apache) if [ "$checka" != "" -o "$checkb" != "" -o "$checkc" != "" -o "$checkd" != "" ]; then apache_inst=1 + gen_logs "Apache (or variant) detected on Debian-based system." msg + else + gen_logs "Apache not found on Debian-based system." msg fi else checka=$(which httpd | grep -i "/httpd" 2>&-) if [ "$checka" != "" ]; then apache_inst=1 - fi + gen_logs "Apache (httpd) detected on Red Hat-based system." msg + else + gen_logs "Apache (httpd) not found on Red Hat-based system." msg + fi fi } @@ -166,9 +209,12 @@ function chk_netstat { check=$(which netstat 2>&-) if [ -n "$check" ]; then netstat_inst=1 + gen_logs "Netstat found at $check" msg + else + gen_logs "Netstat not found on system." msg fi } - + ############################## # Check OS # ############################## @@ -176,50 +222,48 @@ function chk_os { os_install="" os_name="" os_version="" - check=$(cat /etc/*-release | grep -i 'CentOS') - if [ -n "$check" ]; then - os_install=3 - os_name="CentOS" - os_version=$(cat /etc/*-release | grep -i 'VERSION_ID' | awk -F "\"" '{print $2}') - fi - - check=$(cat /etc/*-release | grep -i 'Debian') - if [ -n "$check" -a "$os_install" = "" ]; then - os_install=2 - os_name="Debian" - os_version=$(cat /etc/*-release | grep -i 'VERSION_ID' | awk -F "\"" '{print $2}') - fi - - check=$(cat /etc/*-release | grep -i 'Fedora') - if [ -n "$check" -a "$os_install" = "" ]; then - os_install=3 - os_name="Fedora" - os_version=$(cat /etc/*-release | grep -i 'VERSION_ID' | awk -F "=" '{print $2}') - fi - - check=$(cat /etc/*-release | grep -i 'Red Hat') - if [ -n "$check" -a "$os_install" = "" ]; then - os_install=3 - os_name="Red Hat" - os_version=$(cat /etc/*-release | grep -i 'VERSION_ID' | awk -F "\"" '{print $2}') - fi - - check=$(cat /etc/*-release | grep -i 'SUSE') - if [ -n "$check" -a "$os_install" = "" ]; then - os_install=1 - os_name="SuSE" - os_version=$(cat /etc/*-release | grep -i 'VERSION_ID' | awk -F "\"" '{print $2}' | awk -F "." '{print $1}') - fi - - check=$(cat /etc/*-release | grep -i 'Ubuntu') - if [ -n "$check" -a "$os_install" = "" ] || [ -n "$check" -a "$os_name" = "Debian" ]; then - os_install=2 - os_name="Ubuntu" - os_version=$(cat /etc/*-release | grep -i 'VERSION_ID' | awk -F "\"" '{print $2}' | awk -F "." '{print $1}') + + if [ -f /etc/os-release ]; then + . /etc/os-release + os_name="$ID" # e.g., ubuntu, debian, centos + os_version="${VERSION_ID%%.*}" # major version only + + case "$os_name" in + ubuntu) + os_install=2 + os_name="Ubuntu" + ;; + debian) + os_install=2 + os_name="Debian" + ;; + centos) + os_install=3 + os_name="CentOS" + ;; + rhel|redhat) + os_install=3 + os_name="Red Hat" + ;; + fedora) + os_install=3 + os_name="Fedora" + ;; + suse|sles|opensuse*) + os_install=1 + os_name="SuSE" + ;; + *) + os_install="" + os_name="Unknown" + ;; + esac + gen_logs "OS detected: $os_name $os_version (install type: $os_install)" msg + else + gen_logs "Unable to detect OS – /etc/os-release not found." msg fi } - ############################## # Check MySQL # ############################## @@ -232,7 +276,10 @@ function chk_mysql { fi if [ "$checka" != "" ]; then mysql_inst=1 - fi + gen_logs "MySQL detected on system." msg + else + gen_logs "MySQL not found on system." msg + fi } @@ -249,7 +296,10 @@ function chk_php { fi if [ "$checka" != "" -a "$checkb" != "" ]; then php_inst=1 - fi + gen_logs "PHP and GD module found on system." msg + else + gen_logs "PHP or GD module not found." msg + fi } @@ -273,6 +323,7 @@ function chk_panel { elif [ -d /usr/local/directadmin ]; then web_panel="DirectAdmin" fi + gen_logs "Detected web panel: $web_panel" msg } @@ -288,7 +339,7 @@ function select_yesno { echo "(2) Nein - Beenden" else echo "(1) Yes - Continue" - echo "(2) No - Exit" + echo "(2) No - Exit" fi echo "" @@ -312,14 +363,17 @@ function select_yesno { case "$i" in '1') clear + gen_logs "User selected YES to continue." msg ;; '2') clear + gen_logs "User selected NO to exit installer." msg exit 0 ;; *) yesno=99 clear + gen_logs "Invalid input in select_yesno: $i" msg select_yesno "$1" ;; esac @@ -328,7 +382,7 @@ function select_yesno { ############################## -# Select Lanuage # +# Select Language # ############################## function select_lang { clear @@ -353,17 +407,21 @@ function select_lang { case "$i" in '1') clear + gen_logs "Language selected: German" msg ;; '2') clear + gen_logs "Language selected: English" msg ;; '3') clear + gen_logs "User selected to exit during language selection." msg exit 0 ;; *) langsel=99 clear + gen_logs "Invalid input in select_lang: $i" msg select_lang ;; esac @@ -379,8 +437,7 @@ function select_mode { if [ "$langsel" = "1" ]; then echo "Installation Auswahl" echo "" - echo "Waehlen Sie 1 oder 2. Dies ist perfekt fuer Anfaenger geeignet," - echo "welche nur einen Rootserver nutzen." + echo "Waehlen Sie bevorzugte Option" echo "" echo "(1) Webserver + TekBASE + Teamspeak 3 + Rootserver Einrichtung" echo "(2) Webserver + TekBASE + Rootserver Einrichtung" @@ -396,8 +453,7 @@ function select_mode { else echo "Installation selection" echo "" - echo "Choose 1 or 2. This is perfect for beginners who use only one" - echo "dedicated server." + echo "Choose preferred option." echo "" echo "(1) Webserver + TekBASE + Teamspeak 3 + Dedicated installation" echo "(2) Webserver + TekBASE + Dedicated installation" @@ -433,38 +489,49 @@ function select_mode { case "$i" in '1') clear + gen_logs "Mode selected: 1 (Full setup: Webserver + TekBASE + TS3 + Rootserver)" msg ;; '2') clear + gen_logs "Mode selected: 2 (Webserver + TekBASE + Rootserver)" msg ;; '3') clear + gen_logs "Mode selected: 3 (Webserver + TekBASE)" msg ;; '4') clear + gen_logs "Mode selected: 4 (Webserver + TS3 + Rootserver)" msg ;; '5') clear + gen_logs "Mode selected: 5 (Webserver + Rootserver)" msg ;; '6') clear + gen_logs "Mode selected: 6 (Minimal Webserver setup)" msg ;; '7') clear + gen_logs "Mode selected: 7 (Semi-automatic Webserver install)" msg ;; '8') clear + gen_logs "Mode selected: 8 (TS3 + Rootserver)" msg ;; '9') clear + gen_logs "Mode selected: 9 (Rootserver only)" msg ;; '0') clear + gen_logs "User exited during mode selection." msg exit 0 ;; *) modsel=99 clear + gen_logs "Invalid input in select_mode: $i" msg select_mode ;; esac @@ -477,109 +544,55 @@ function select_mode { ############################## function select_url { clear - if [ "$langsel" = "1" ]; then - echo "Domains Auswahl" - echo "" - else - echo "Domain selection" - echo "" + [[ "$langsel" = "1" ]] && echo "Domains Auswahl" || echo "Domain selection" + echo "" + + # Ensure the directory exists + cd "$1" || { echo "Directory $1 not found!"; gen_logs "Directory $1 not found in select_url." msg; exit 1; } + + # Use an updated regex to match valid domain names and IPs + mapfile -t url_list < <(find . -maxdepth 1 -type d -printf '%f\n' | grep -E '^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$|^([0-9]{1,3}\.){3}[0-9]{1,3}$') + url_list=("${url_list[@]:0:9}") + + # Check if no valid domains or IPs are found + if [ "${#url_list[@]}" -eq 0 ]; then + echo "No valid domains/IPs found." + gen_logs "No valid domains or IP directories found in select_url." msg + exit 1 fi - cd $1 - urlcounter=1 - for siteurl in $(find * -maxdepth 0 -type d) - do - if [ "$(grep -E '^(([a-zA-Z](-?[a-zA-Z0-9])*)\.)*[a-zA-Z](-?[a-zA-Z0-9])+\.[a-zA-Z]{2,}$' <<< $siteurl)" != "" ]; then - echo "($urlcounter) $siteurl" - let urlcounter=$urlcounter+1 - fi - if [ "$urlcounter" -gt 9 ]; then - break - fi + # Display the list of valid domains/IPs + for i in "${!url_list[@]}"; do + echo "($((i+1))) ${url_list[$i]}" done - - echo "" + + echo "" echo "(0) Exit" echo "" - if [ "$langsel" = "1" ]; then - if [ "$urlsel" = "" ]; then - echo -n "Bitte geben Sie ihre Auswahl an: " - else - color r n "Bitte geben Sie entweder 1, ... oder 0 ein: " - fi - else - if [ "$urlsel" = "" ]; then - echo -n "Please enter your selection: " - else - color r n "Please enter either 1, ... or 0: " - fi - fi - + # Prompt the user for selection + [[ "$langsel" = "1" ]] && prompt="Bitte geben Sie Ihre Auswahl an: " || prompt="Please enter your selection: " + echo -n "$prompt" read -n 1 urlsel + echo "" - for i in $urlsel; do - case "$i" in - '1') - clear - ;; - '2') - clear - ;; - '3') - clear - ;; - '4') - clear - ;; - '5') - clear - ;; - '6') - clear - ;; - '7') - clear - ;; - '8') - clear - ;; - '9') - clear - ;; - '0') - clear - exit 0 - ;; - *) - urlsel=99 - clear - select_url - ;; - esac - done - - let urlcounter=$urlcounter-1 - - if [ "$urlsel" -gt "$urlcounter" ]; then - select_url + # Validate the selection and set the site_url + if [[ "$urlsel" =~ ^[1-9]$ ]] && (( urlsel <= ${#url_list[@]} )); then + site_url="${url_list[$((urlsel-1))]}" + gen_logs "User selected site directory: $site_url" msg + clear + elif [[ "$urlsel" == "0" ]]; then + clear + gen_logs "User exited during domain/IP selection." msg + exit 0 + else + clear + gen_logs "Invalid input during select_url: $urlsel" msg + echo "Invalid selection." + select_url "$1" fi - - urlcounter=1 - for siteurl in $(find * -maxdepth 0 -type d) - do - if [ "$(grep -E '^(([a-zA-Z](-?[a-zA-Z0-9])*)\.)*[a-zA-Z](-?[a-zA-Z0-9])+\.[a-zA-Z]{2,}$' <<< $siteurl)" != "" ]; then - if [ "$urlcounter" = "$urlsel" ]; then - site_url=$siteurl - break - else - let urlcounter=$urlcounter+1 - fi - fi - done } - ############################## # Select SSH Keys # ############################## @@ -589,7 +602,7 @@ function select_sshkeys { echo "SSH Key Auswahl" echo "" echo "Sollen eigene SSH Keys generiert werden? Dies wird für den" - echo "ersten beziehungsweise einzigen Server empfohlen." + echo "ersten beziehungsweise einzigen Server empfohlen." echo "" echo "(1) Ja" echo "(2) Nein" @@ -598,7 +611,7 @@ function select_sshkeys { echo "SSH Key selection" echo "" echo "Should own SSH keys be generated? This is recommended for the" - echo "first or only server." + echo "first or only server." echo "" echo "(1) Yes" echo "(2) No" @@ -607,17 +620,9 @@ function select_sshkeys { echo "" if [ "$langsel" = "1" ]; then - if [ "$sshsel" = "" ]; then - echo -n "Bitte geben Sie ihre Auswahl an: " - else - color r n "Bitte geben Sie entweder 1,2 oder 3 ein: " - fi + [ "$sshsel" = "" ] && echo -n "Bitte geben Sie ihre Auswahl an: " || color r n "Bitte geben Sie entweder 1,2 oder 3 ein: " else - if [ "$sshsel" = "" ]; then - echo -n "Please enter your selection: " - else - color r n "Please enter either 1,2 or 3: " - fi + [ "$sshsel" = "" ] && echo -n "Please enter your selection: " || color r n "Please enter either 1,2 or 3: " fi read -n 1 sshsel @@ -626,17 +631,21 @@ function select_sshkeys { case "$i" in '1') clear + gen_logs "User selected to generate SSH keys." msg ;; '2') clear + gen_logs "User selected not to generate SSH keys." msg ;; '3') clear + gen_logs "User exited during SSH key selection." msg exit 0 ;; *) sshsel=99 clear + gen_logs "Invalid input during SSH key selection: $i" msg select_sshkeys ;; esac @@ -653,6 +662,7 @@ fi gen_logs "" "" + ############################## # Test OS # ############################## @@ -667,6 +677,7 @@ if [ ! -n "$os_install" -o ! -n "$os_name" -o ! -n "$os_version" ]; then else color r x "Only CentOS, Debian, Fedora, Red Hat, SuSE and Ubuntu are supported." fi + gen_logs "Unsupported OS detected. Exiting. Detected values: $os_name $os_version ($os_install)" msg exit 0 fi @@ -677,7 +688,7 @@ if [ ! -n "$yessel" ]; then else select_yesno "Your system: $os_name $os_version - $os_typ. Is this correct?" fi - gen_logs "System: $os_name $os_version - $os_typ" "" + gen_logs "System: $os_name $os_version - $os_typ" msg fi @@ -695,37 +706,78 @@ if [ "$(id -u)" != "0" ]; then else color r x "You need root privileges." fi - gen_logs "You need root privileges. Install script was stopped." "" + gen_logs "You need root privileges. Install script was stopped." msg exit 0 +else + gen_logs "Root privileges confirmed." msg fi ############################## # Get IP, Hostname # ############################## -local_ip=$(ip route get 8.8.8.8 | awk '{print $NF; exit}') -if [ "$local_ip" = "" ]; then - host_name=$(hostname -fhost_name | awk '{print tolower($0)}') -else - host_name=$(getent hosts $local_ip | awk '{print tolower($2)}' | head -n 1) + +# Get the local IP address (used if the hostname isn't valid) +local_ip=$(ip route get 8.8.8.8 2>/dev/null | awk '{print $7; exit}') + +# Get the fully qualified hostname (if available) +host_name=$(hostname -f 2>/dev/null | awk '{print tolower($0)}') + +# Fallback if hostname is empty or unreliable +if [ -z "$host_name" ]; then + host_name=$(hostname | awk '{print tolower($0)}') +fi + +# Replace unreliable hostnames with IP (e.g., localhost or ubuntu) +if [[ -z "$host_name" || "$host_name" =~ ^(localhost|ubuntu|0)$ ]]; then + host_name="$local_ip" fi -if [ "$host_name" = "" ] || [ "$host_name" = "0" ]; then - host_name="$local_ip"; + +# Ensure proper /etc/hosts entry if needed for hostname resolution +if ! grep -qE "127\.0\.1\.1\s+$host_name" /etc/hosts; then + if ! [[ "$host_name" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Fixing /etc/hosts for hostname resolution: $host_name" + echo "127.0.1.1 $host_name" >> /etc/hosts + gen_logs "Hostname $host_name added to /etc/hosts for resolution." msg + else + gen_logs "Skipping /etc/hosts entry — host_name is an IP: $host_name" msg + fi fi -gen_logs "Hostname and IP - $host_name, $local_ip" "" +# Log the resolved hostname and IP address +gen_logs "Hostname and IP - $host_name, $local_ip" msg + +# Ensure correct site URL if not already set +if [ -z "$site_url" ]; then + site_url="$host_name" + gen_logs "No site_url selected, using hostname: $site_url" msg +fi + +# Ensure /etc/hosts maps site_url to local IP if it's not an IP +if ! [[ "$site_url" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + if ! grep -q "$site_url" /etc/hosts; then + echo "$local_ip $site_url" >> /etc/hosts + gen_logs "Mapped $site_url to $local_ip in /etc/hosts" msg + fi +fi + +# Ensure the selected site URL is accessible and valid +echo "Using site URL: $site_url" +gen_logs "Selected site URL: $site_url" msg ############################## # Choose Mode # ############################## if [ ! -n "$modsel" ]; then select_mode + gen_logs "Installation mode selected: $modsel" msg fi chk_netstat +gen_logs "Netstat check completed (status var: $netstat_inst)" msg echo "" > /home/tekbase_status.txt - +gen_logs "Status file initialized at /home/tekbase_status.txt" msg ############################## # Install Libs And Progs # @@ -733,361 +785,424 @@ echo "" > /home/tekbase_status.txt if [ ! -n "$yessel" ]; then yesno="" if [ "$langsel" = "1" ]; then - select_yesno "Es wird jetzt autoconf, automake, build-essential, curl, expect, gcc, hddtemp,\ndmidecode, lm-sensors, m4, make, net-tools, openjdk, openssl-dev, patch, pwgen,\nscreen, smartmontools, sqlite, sudo, sysstat, unzip und wget installiert." + gen_logs "Benutzer wird gefragt, ob Bibliotheken/Programme installiert werden sollen." msg + select_yesno "Es wird jetzt autoconf, automake, build-essential, curl, expect, gcc, \ndmidecode, lm-sensors, m4, make, net-tools, openjdk, openssl-dev, patch, pwgen,\nscreen, smartmontools, sqlite, sudo, sysstat, gnupg, unzip und wget installiert." else - select_yesno "Autoconf, automake, build-essential, curl, expect gcc, hddtemp, dmidecode,\nlm-sensors, m4, make, net-tools, openjdk, openssl-dev, patch, pwgen, screen,\nsmartmontools, sqlite, sudo, sysstat, unzip and wget is now installed." + gen_logs "User is prompted to install required packages and libraries." msg + select_yesno "Autoconf, automake, build-essential, curl, expect, gcc, dmidecode,\nlm-sensors, m4, make, net-tools, openjdk, openssl-dev, patch, pwgen, screen,\nsmartmontools, sqlite, sudo, sysstat, gnupg, unzip and wget will now be installed." fi fi case "$os_install" in - '1') + '1') # SuSE clear + gen_logs "Installing packages using Zypper (SuSE detected)." msg if [ "$modsel" != "7" ]; then chkyes="--non-interactive install" - zypper --non-interactive update - else + gen_logs "zypper --non-interactive update" cmd + else chkyes="install" - zypper update + gen_logs "zypper update" cmd fi - for i in autoconf automake m4 make screen sudo curl wget sqlite sqlite3 expect gcc libssh2-1-devel libopenssl-devel libmp3lame-devel libxml2-devel libxslt-devel libshout-dev libvorbis-devel hddtemp dmidecode lm-sensors net-tools sysstat smartmontools patch pwgen unzip java-1_8_0-openjdk git; do - zypper $chkyes $i - gen_logs "-" "${i}" + + for i in autoconf automake m4 make screen sudo curl wget sqlite sqlite3 expect gcc \ + libssh2-1-devel libopenssl-devel libmp3lame-devel libxml2-devel libxslt-devel \ + libshout-devel libvorbis-devel dmidecode lm-sensors net-tools sysstat \ + smartmontools patch pwgen unzip java-11-openjdk git gnupg; do + gen_logs "zypper $chkyes $i" cmd + gen_logs "Installed package: ${i}" msg done - zypper $chkyes -t pattern devel_basis + + gen_logs "zypper $chkyes -t pattern devel_basis" cmd ;; - '2') + + '2') # Debian / Ubuntu clear + gen_logs "Installing packages using apt-get (Debian/Ubuntu detected)." msg if [ "$modsel" != "7" ]; then chkyes="-y" - apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y else chkyes="" - apt-get update && apt-get upgrade && apt-get dist-upgrade - fi - for i in autoconf automake build-essential m4 make debconf-utils screen sudo curl wget sqlite sqlite3 expect gcc libssh2-1-dev libssl-dev libmp3lame-dev libxml2-dev libshout-dev libvorbis-dev hddtemp dmidecode lm-sensors net-tools sysstat smartmontools patch pwgen unzip git; do - apt-get install $i $chkyes - gen_logs "-" "${i}" - done - if [ "$os_version" -lt "14" -a "$os_name" = "Ubuntu" ] || [ "$os_version" -lt "8" -a "$os_name" = "Debian" ]; then - apt-get install openjdk-7-jre ia32-libs $chkyes - else - apt-get install openjdk-8-jre libcurl3-gnutls:i386 $chkyes fi + + gen_logs "apt-get update && apt-get upgrade $chkyes" cmd + + for i in autoconf automake build-essential m4 make debconf-utils screen sudo curl wget \ + sqlite3 expect gcc libssh2-1-dev libssl-dev libmp3lame-dev libxml2-dev \ + libshout-dev libvorbis-dev dmidecode lm-sensors net-tools sysstat \ + smartmontools patch pwgen unzip git gnupg; do + gen_logs "apt-get install $i $chkyes" cmd + gen_logs "Installed package: ${i}" msg + done + + gen_logs "Installing Java (openjdk-17-jre)" msg + gen_logs "apt-get install openjdk-17-jre $chkyes" cmd + + gen_logs "Adding i386 architecture (if needed)" msg + dpkg --add-architecture i386 + apt-get update + + gen_logs "Installing 32-bit libcurl for compatibility" msg + gen_logs "apt-get install libcurl4-gnutls-dev:i386 $chkyes" cmd ;; - '3') + + '3') # CentOS / Red Hat / Fedora clear + gen_logs "Installing packages using yum/dnf (RedHat-based OS detected)." msg + if command -v dnf >/dev/null 2>&1; then + pkgmgr="dnf" + else + pkgmgr="yum" + fi + if [ "$modsel" != "7" ]; then chkyes="-y" - yum update && yum upgrade -y else chkyes="" - yum update && yum upgrade fi - yum -y install epel-release - yum repolist - for i in autoconf automake m4 make screen sudo curl wget sqlite expect gcc openssl-devel hddtemp dmidecode lm-sensors net-tools sysstat smartmontools patch pwgen unzip java-1.8.0-openjdk git; do - yum install $i $chkyes - gen_logs "-" "${i}" + + gen_logs "$pkgmgr update $chkyes" cmd + + gen_logs "Installing epel-release" msg + $pkgmgr install epel-release -y + + gen_logs "Getting repo list" msg + $pkgmgr repolist + + for i in autoconf automake m4 make screen sudo curl wget sqlite expect gcc openssl-devel \ + dmidecode lm-sensors net-tools sysstat smartmontools patch pwgen unzip \ + java-11-openjdk git gnupg; do + gen_logs "$pkgmgr install $i $chkyes" cmd + gen_logs "Installed package: ${i}" msg done - yum groupinstall 'Development Tools' $chkyes + + gen_logs "$pkgmgr groupinstall 'Development Tools' $chkyes" cmd ;; esac -sensors-detect --auto -service kmod start - +# Enable sensors (optional - may prompt user) +gen_logs "yes | sensors-detect --auto" cmd ############################## -# Install Apache, Php, MySQL # +# Install Apache, PHP, MySQL # ############################## -if [ $modsel -lt 8 ]; then - chk_apache $os_install - - if [ "$apache_inst" = "0" ]; then - if [ ! -n "$yessel" ]; then +if [[ "$modsel" -lt 8 ]]; then + + # --- Apache Installation --- + chk_apache "$os_install" + + if [[ "$apache_inst" == "0" ]]; then + gen_logs "Apache not detected. Proceeding with installation." msg + if [[ -z "$yessel" ]]; then yesno="" - if [ "$langsel" = "1" ]; then + if [[ "$langsel" == "1" ]]; then select_yesno "Apache Webserver nicht gefunden. Dieser wird jetzt installiert." else select_yesno "Apache web server not found. This will now be installed." fi fi - if [ "$os_install" = "1" ]; then - if [ "$modsel" != "7" ]; then - zypper --non-interactive install apache2 - else - zypper install apache2 - fi - fi - if [ "$os_install" = "2" ]; then - if [ "$modsel" != "7" ]; then + case "$os_install" in + "1") # openSUSE + gen_logs "zypper --non-interactive install apache2" cmd || exit 1 + systemctl enable apache2 + systemctl restart apache2 + ;; + "2") # Debian/Ubuntu export DEBIAN_FRONTEND=noninteractive - apt-get install apache2 -y - else - apt-get install apache2 - fi - fi - if [ "$os_install" = "3" ]; then - if [ "$modsel" != "7" ]; then - yum install httpd -y - else - yum install httpd - fi - fi - - chk_apache $os_install - - if [ "$apache_inst" = "0" ]; then + gen_logs "apt-get install -y apache2" cmd || exit 1 + gen_logs "systemctl enable apache2" cmd + gen_logs "systemctl restart apache2" cmd + ;; + "3") # RHEL/CentOS + gen_logs "yum install -y httpd" cmd || exit 1 + systemctl enable httpd + systemctl restart httpd + ;; + esac + + chk_apache "$os_install" + if [[ "$apache_inst" == "0" ]]; then clear - if [ "$langsel" = "1" ]; then - color r x "Der Apache Webserver konnte nicht installiert werden." - color r x "Bitte nehmen Sie die Installation selbst vor." - else - color r x "The Apache web server could not be installed." - color r x "Please install it yourself." - fi + echo "[ERROR] Apache installation failed. Please install manually." echo "Check apache: error" >> /home/tekbase_status.txt - gen_logs "*** The Apache web server could not be installed." "" - exit 0 + gen_logs "*** Apache could not be installed." msg + exit 1 fi + echo "Check apache: ok" >> /home/tekbase_status.txt - gen_logs "*** The Apache web server is installed." "" + gen_logs "*** Apache installed successfully." msg else - echo "Check apache: ok" >> /home/tekbase_status.txt + echo "Check apache: ok" >> /home/tekbase_status.txt + gen_logs "Apache already installed." msg fi - if [ ! -n "$yessel" ]; then - yesno="" - if [ "$langsel" = "1" ]; then - select_yesno "Es wird jetzt php, php-common, php-cli, php-curl, php-gd, php-geoip, php-json,\nphp-mail, php-mbstring, php-mysql, php-ssh2, php-xml und php-zip\ninstalliert." + # --- PHP Installation --- + if [[ -z "$yessel" ]]; then + if [[ "$langsel" == "1" ]]; then + select_yesno "Es wird jetzt PHP 8.4 und notwendige Erweiterungen installiert." else - select_yesno "Php, php-common, php-cli, php-curl, php-gd, php-geoip, php-json, php-mail,\nphp-mbstring, php-mysql, php-ssh2, php-xml and php-zip is now\ninstalled." + select_yesno "PHP 8.4 and necessary extensions will now be installed." fi fi - if [ "$os_install" = "1" ]; then - if [ "$os_version" -lt "42" ]; then - for i in apache2-mod-php5 php5 php5-common php5-cli php5-curl php5-devel php5-gd php5-geoip php5-json php5-mail php5-mbstring php5-mysql php5-ssh2 php5-xml php5-zip; do - zypper $chkyes $i - gen_logs "-" "${i}" - done - else - for i in apache2-mod-php7 php7 php7-common php7-cli php7-curl php7-devel php7-gd php7-geoip php7-json php7-mail php7-mbstring php7-mysql php7-ssh2 php7-xml php7-zip; do - zypper $chkyes $i - gen_logs "-" "${i}" - done - fi - fi - if [ "$os_install" = "2" ]; then - if [ "$os_version" -lt "16" -a "$os_name" = "Ubuntu" ] || [ "$os_version" -lt "9" -a "$os_name" = "Debian" ]; then - for i in libapache2-mod-php5 php5 php5-common php5-cli php5-curl php5-dev php5-gd php5-geoip php5-json php5-mail php5-mbstring php5-mysql php5-ssh2 php5-xml php5-zip; do - apt-get install $i $chkyes - gen_logs "-" "${i}" - done - else - for i in libapache2-mod-php php php-common php-cli php-curl php-dev php-gd php-geoip php-json php-mail php-mbstring php-mysql php-ssh2 php-xml php-zip; do - apt-get install $i $chkyes - gen_logs "-" "${i}" - done - fi - fi - if [ "$os_install" = "3" ]; then - for i in php php-common php-cli php-devel php-gd php-json php-mbstring php-mysql php-pecl-ssh2 php-xml php-pecl-zip; do - yum install $i $chkyes - gen_logs "-" "${i}" - done - fi - - chk_php $os_install + gen_logs "[INFO] Installing PHP 8.4 and necessary modules..." msg - if [ "$php_inst" = "0" ]; then + case "$os_install" in + "1") # openSUSE + gen_logs "zypper refresh" cmd + if zypper search php8.4 &>/dev/null; then + packages="apache2-mod-php8.4 php8.4 php8.4-common php8.4-cli php8.4-curl php8.4-devel php8.4-gd php8.4-mbstring php8.4-mysql php8.4-ssh2 php8.4-xml php8.4-zip php8.4-intl" + else + gen_logs "[WARNING] PHP 8.4 is not available in openSUSE. Using default PHP 8 packages." msg + packages="apache2-mod-php8 php8 php8-common php8-cli php8-curl php8-devel php8-gd php8-mbstring php8-mysql php8-ssh2 php8-xml php8-zip php8-intl" + fi + gen_logs "zypper install -y $packages" cmd || { gen_logs "[ERROR] PHP installation failed!"; exit 1; } + ;; + + "2") # Debian/Ubuntu + export DEBIAN_FRONTEND=noninteractive + gen_logs "apt-get update -y" cmd + gen_logs "apt-get install -y software-properties-common" cmd + gen_logs "add-apt-repository -y ppa:ondrej/php" cmd + gen_logs "apt-get update -y" cmd + + if apt-cache show php8.4 &>/dev/null; then + PHPV="8.4" + else + gen_logs "[WARNING] PHP 8.4 is not available in PPA. Installing PHP 8.3 instead." msg + PHPV="8.3" + fi + + packages="libapache2-mod-php$PHPV php$PHPV php$PHPV-common php$PHPV-cli php$PHPV-curl php$PHPV-dev php$PHPV-gd php$PHPV-mbstring php$PHPV-mysql php$PHPV-ssh2 php$PHPV-xml php$PHPV-zip php$PHPV-intl" + + gen_logs "apt-get install -y $packages" cmd || { gen_logs "[ERROR] PHP installation failed!"; exit 1; } + ;; + + "3") # RHEL/CentOS + gen_logs "yum install -y epel-release yum-utils" cmd + gen_logs "yum install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm" cmd + + if yum list available | grep -q remi-php84; then + gen_logs "yum-config-manager --enable remi-php84" cmd + PHPV="8.4" + else + gen_logs "[WARNING] PHP 8.4 not available in Remi repo. Installing PHP 8.3 instead." msg + gen_logs "yum-config-manager --enable remi-php83" cmd + PHPV="8.3" + fi + + packages="php php-common php-cli php-curl php-devel php-gd php-mbstring php-mysqlnd php-pecl-ssh2 php-xml php-pecl-zip php-intl" + + gen_logs "yum install -y $packages" cmd || { gen_logs "[ERROR] PHP installation failed!"; exit 1; } + ;; + esac + + chk_php "$os_install" + if [[ "$php_inst" == "0" ]]; then clear - if [ "$langsel" = "1" ]; then - color r x "PHP und die Extensions konnten nicht vollstaendig installiert werden." - color r x "Bitte nehmen Sie die Installation selbst vor." + if [[ "$langsel" == "1" ]]; then + color r x "PHP und die Erweiterungen konnten nicht vollständig installiert werden." + color r x "Bitte nehmen Sie die Installation manuell vor." else - color r x "PHP and the extensions could not be installed completely." - color r x "Please install it yourself." - fi + color r x "PHP and its extensions could not be completely installed." + color r x "Please complete the installation manually." + fi echo "Check php: error" >> /home/tekbase_status.txt - gen_logs "*** PHP could not be installed." "" - exit 0 + gen_logs "*** PHP 8.4 installation verification failed." msg + exit 1 fi + echo "Check php: ok" >> /home/tekbase_status.txt - gen_logs "*** PHP is installed." "" + gen_logs "*** PHP 8.4 successfully installed." msg + # --- Install MySQL/MariaDB --- chk_mysql $os_install - + if [ "$mysql_inst" = "0" ]; then - if [ ! -n "$yessel" ]; then + echo "MySQL/MariaDB not found. Proceeding with installation." + + [ -z "$yessel" ] && { yesno="" - if [ "$langsel" = "1" ]; then - select_yesno "MySQL/MariaDB Server nicht gefunden. Dieser wird jetzt installiert." - else - select_yesno "MySQL/MariaDB server not found. This will now be installed." - fi - fi - - if [ "$os_install" = "1" ]; then - zypper $chkyes mariadb mariadb-tools - service mysql restart - fi - if [ "$os_install" = "2" ]; then - if [ "$modsel" != "7" ]; then + [ "$langsel" = "1" ] && select_yesno "MySQL/MariaDB Server wird installiert." || select_yesno "MySQL/MariaDB server will be installed." + } + + mysqlpwd=$(gen_passwd 12) + echo "MySQL root password: $mysqlpwd" > /home/tekbase_mysql.txt + echo "Generated MySQL root password stored in /home/tekbase_mysql.txt" + + case "$os_install" in + "1") # openSUSE + zypper --non-interactive install mariadb mariadb-tools + systemctl enable mariadb + systemctl start mariadb + ;; + + "2") # Debian/Ubuntu export DEBIAN_FRONTEND=noninteractive - fi - - mysqlpwd=$(gen_passwd 8) - echo "MySQL root password: $mysqlpwd" > /home/tekbase_mysql.txt - - if [ "$os_version" -lt "16" -a "$os_name" = "Ubuntu" ] || [ "$os_version" -lt "9" -a "$os_name" = "Debian" ]; then - mysqlpwd=$(gen_passwd 8) - if [ "$modsel" != "7" ]; then - debconf-set-selections <<< "mysql-server mysql-server/root_password password $mysqlpwd" - debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $mysqlpwd" - fi - apt-get install mysql-server mysql-client mysql-common $chkyes - else - if [ "$modsel" != "7" ]; then - debconf-set-selections <<< "mariadb-server mysql-server/root_password password $mysqlpwd" - debconf-set-selections <<< "mariadb-server mysql-server/root_password_again password $mysqlpwd" + apt-get update + debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $mysqlpwd" + debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $mysqlpwd" + + gen_logs "apt-get install -y mariadb-server mariadb-client" cmd + gen_logs "systemctl enable mariadb" cmd + gen_logs "systemctl start mariadb" cmd + + sleep 5 + if mysqladmin ping >/dev/null 2>&1; then + echo "🔐 Switching root to password auth and setting password..." + + if mysql -u root -e "SELECT VERSION();" | grep -qi "mariadb"; then + # ✅ MariaDB 10.4+ syntax + mysql -u root <> /home/tekbase_status.txt - exit 0 + exit 1 fi + echo "Check mysql: ok" >> /home/tekbase_status.txt + echo "✅ MySQL/MariaDB successfully installed." else - mysqlpwd="" - echo "Check mysql: ok" >> /home/tekbase_status.txt + echo "Check mysql: ok" >> /home/tekbase_status.txt + echo "✅ MySQL/MariaDB already installed." fi -fi +fi ############################## -# Check Php Version And Path # +# Check PHP Version And Paths # ############################## -if [ $modsel -lt 8 ]; then - service apache2 restart +if [ "$modsel" -lt 8 ]; then + if systemctl list-units --type=service | grep -q apache2; then + gen_logs "systemctl restart apache2" cmd + gen_logs "Restarted apache2 service." msg + elif systemctl list-units --type=service | grep -q httpd; then + gen_logs "systemctl restart httpd" cmd + gen_logs "Restarted httpd service." msg + fi + php_ioncube=$(php -m | grep -i "ioncube") - # php_geoip=$(php -m | grep -i "geoip") - php_ssh=$(php -m | grep -i "ssh2") - # php_gd=$(php -m | grep -i "gd") - php_version=$(php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;") + php_ssh=$(php -m | grep -i "ssh2") + + php_version=$(php -r "echo PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;") php_inidir=$(php -r "echo PHP_CONFIG_FILE_PATH;") php_extdir=$(php -r "echo PHP_EXTENSION_DIR;") php_exinidir=$(php -r "echo PHP_CONFIG_FILE_SCAN_DIR;") - php_dir=$(dirname "$php_inidir"); - if [ -f $php_dir/apache2/php.ini ]; then + php_dir=$(dirname "$php_inidir") + + php_apachedir="" + php_fpmdir="" + + if [ -f "$php_dir/apache2/php.ini" ]; then php_apachedir="$php_dir/apache2" fi - if [ -f $php_dir/fpm/php.ini ]; then + if [ -f "$php_dir/fpm/php.ini" ]; then php_fpmdir="$php_dir/fpm" fi -fi + if systemctl list-units --type=service | grep -q "php${php_version/./}-fpm"; then + gen_logs "systemctl restart php${php_version/./}-fpm" cmd + gen_logs "Restarted php${php_version/./}-fpm service." msg + elif systemctl list-units --type=service | grep -q php-fpm; then + gen_logs "systemctl restart php-fpm" cmd + gen_logs "Restarted php-fpm service." msg + fi + + gen_logs "Detected PHP $php_version, INI: $php_inidir, EXT: $php_extdir, SCAN: $php_exinidir" msg +fi ############################## # Install Pecl SSH2, Ioncube # ############################## -if [ $modsel -lt 8 ]; then +if [ "$modsel" -lt 8 ]; then if [ "$php_ssh" = "" ]; then - cd $installhome - + cd "$installhome" + if [ ! -f libssh2-1.9.0.tar.gz ]; then wget --no-check-certificate https://www.libssh2.org/download/libssh2-1.9.0.tar.gz fi tar -xzf libssh2-1.9.0.tar.gz cd libssh2-1.9.0 - ./configure --prefix=/usr --with-openssl=/usr && make install + export OPENSSL_CONF=/etc/ssl/openssl.cnf + ./configure --prefix=/usr --with-openssl --with-libssl-prefix=/usr && make -j$(nproc) && make install cd .. + rm -rf libssh2-1.9.0 libssh2-1.9.0.tar.gz + gen_logs "Compiled and installed libssh2." msg - if [ "$php_version" = "5.6" ] || [ "$php_version" = "7.0" ]; then - if [ ! -f ssh2-0.13.tgz ]; then - wget --no-check-certificate https://pecl.php.net/get/ssh2-0.13.tgz - fi - tar -xzf ssh2-0.13.tgz - cd ssh2-0.13 - phpize && ./configure --with-ssh2 && make install - cd .. - rm -r ssh2-0.13.0 - rm ssh2-0.13.tgz + if [[ "$php_version" == "5.6" || "$php_version" == "7.0" ]]; then + ssh2_pkg="ssh2-0.13" else - if [ ! -f ssh2-1.1.2.tgz ]; then - wget --no-check-certificate https://pecl.php.net/get/ssh2-1.1.2.tgz - fi - tar -xzf ssh2-1.1.2.tgz - cd ssh2-1.1.2 - phpize && ./configure --with-ssh2 && make install - cd .. - rm -r ssh2-1.1.2 - rm ssh2-1.1.2.tgz + ssh2_pkg="ssh2-1.3.1" fi - rm -r libssh2-1.9.0 - rm package.xml - - cd $php_exinidir - echo "extension=ssh2.so" > 20-ssh2.ini - if [ "$os_install" = "1" -o "$os_install" = "2" ]; then - if [ -d $php_apachedir/conf.d ]; then - echo "extension=ssh2.so" > $php_apachedir/conf.d/20-ssh2.ini - fi - if [ -d $php_fpmdir/conf.d ]; then - echo "extension=ssh2.so" > $php_apachedir/conf.d/20-ssh2.ini - fi + if [ ! -f "$ssh2_pkg.tgz" ]; then + wget --no-check-certificate "https://pecl.php.net/get/$ssh2_pkg.tgz" fi - - php_ssh=$(php -m | grep -i "ssh2") + + tar -xzf "$ssh2_pkg.tgz" + cd "$ssh2_pkg" + phpize && ./configure --with-ssh2 && make -j$(nproc) && make install + cd .. + rm -rf "$ssh2_pkg" "$ssh2_pkg.tgz" + gen_logs "Compiled and installed SSH2 extension." msg + + echo "extension=ssh2.so" > "$php_exinidir/20-ssh2.ini" + if [ "$os_install" = "1" ] || [ "$os_install" = "2" ]; then + [ -d "$php_apachedir/conf.d" ] && echo "extension=ssh2.so" > "$php_apachedir/conf.d/20-ssh2.ini" + [ -d "$php_fpmdir/conf.d" ] && echo "extension=ssh2.so" > "$php_fpmdir/conf.d/20-ssh2.ini" + fi + + php_ssh=$(php -m | grep -i "ssh2") if [ "$php_ssh" = "" ]; then clear - if [ "$langsel" = "1" ]; then - color r x "Die Pecl SSH2 Extension für PHP konnte nicht installiert werden." - color r x "Bitte nehmen Sie die Installation selbst vor." - else - color r x "The Pecl SSH2 extension for PHP could not be installed." - color r x "Please install it yourself." - fi echo "Check ssh2: error" >> /home/tekbase_status.txt - exit 0 + gen_logs "SSH2 PHP extension failed to install." msg + exit 1 else echo "Check ssh2: ok" >> /home/tekbase_status.txt + gen_logs "SSH2 PHP extension installed successfully." msg fi else - echo "Check ssh2: ok" >> /home/tekbase_status.txt - fi - - sed -i '/^HostKeyAlgorithms*/d' /etc/sshd/sshd_config - sed -i '/^PubkeyAcceptedKeyTypes*/d' /etc/sshd/sshd_config - echo "HostKeyAlgorithms ssh-rsa,ssh-dss" >> /etc/sshd/sshd_config - echo "PubkeyAcceptedKeyTypes ssh-rsa,ssh-dss" >> /etc/sshd/sshd_config - + echo "Check ssh2: ok" >> /home/tekbase_status.txt + gen_logs "SSH2 PHP extension already installed." msg + fi + + sed -i '/^HostKeyAlgorithms*/d' /etc/ssh/sshd_config + sed -i '/^PubkeyAcceptedKeyTypes*/d' /etc/ssh/sshd_config + echo "HostKeyAlgorithms ssh-rsa,ssh-dss" >> /etc/ssh/sshd_config + echo "PubkeyAcceptedKeyTypes ssh-rsa,ssh-dss" >> /etc/ssh/sshd_config + gen_logs "Updated SSH config to support older key algorithms." msg + if [ "$php_ioncube" = "" ]; then cd /usr/local - - if [ -d ioncube ]; then - rm ioncube - fi + [ -d ioncube ] && rm ioncube if [ "$os_typ" = "x86_64" ]; then wget --no-check-certificate https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz @@ -1096,112 +1211,103 @@ if [ $modsel -lt 8 ]; then wget --no-check-certificate https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz tar xvfz ioncube_loaders_lin_x86.tar.gz fi + if [ ! -d ioncube ]; then cd $installhome mv ioncube_x86-64.tar.gz /usr/local mv ioncube_x86.tar.gz /usr/local cd /usr/local - - if [ "$os_typ" = "x86_64" ]; then - tar -xzf ioncube_x86-64.tar.gz - rm ioncube_x86-64.tar.gz - else - tar -xzf ioncube_x86.tar.gz - rm ioncube_x86.tar.gz - fi + [ "$os_typ" = "x86_64" ] && tar -xzf ioncube_x86-64.tar.gz || tar -xzf ioncube_x86.tar.gz + rm ioncube_x86*.tar.gz fi - + cd ioncube cp *.* $php_extdir cd $php_exinidir echo "zend_extension=ioncube_loader_lin_$php_version.so" > 00-ioncube.ini if [ "$os_install" = "1" -o "$os_install" = "2" ]; then - if [ -d $php_apachedir/conf.d ]; then - echo "zend_extension=$php_extdir/ioncube_loader_lin_$php_version.so" > $php_apachedir/conf.d/00-ioncube.ini - fi - if [ -d $php_fpmdir/conf.d ]; then - echo "zend_extension=$php_extdir/ioncube_loader_lin_$php_version.so" > $php_fpmdir/conf.d/00-ioncube.ini - fi - fi - - php_ioncube=$(php -m | grep -i "ioncube") - if [ "$php_ioncube" = "" ]; then + [ -d $php_apachedir/conf.d ] && echo "zend_extension=$php_extdir/ioncube_loader_lin_$php_version.so" > $php_apachedir/conf.d/00-ioncube.ini + [ -d $php_fpmdir/conf.d ] && echo "zend_extension=$php_extdir/ioncube_loader_lin_$php_version.so" > $php_fpmdir/conf.d/00-ioncube.ini + fi + + php_ioncube=$(php -m | grep -i "ioncube") + if [ "$php_ioncube" = "" ]; then clear - if [ "$langsel" = "1" ]; then - color r x "Die Ioncube Extension für PHP konnte nicht installiert werden." - color r x "Bitte nehmen Sie die Installation selbst vor." - else - color r x "The Ioncube extension for PHP could not be installed." - color r x "Please install it yourself." - fi echo "Check ioncube: error" >> /home/tekbase_status.txt + gen_logs "Ioncube extension failed to install." msg exit 0 else echo "Check ioncube: ok" >> /home/tekbase_status.txt + gen_logs "Ioncube extension installed successfully." msg fi else - echo "Check ioncube: ok" >> /home/tekbase_status.txt + echo "Check ioncube: ok" >> /home/tekbase_status.txt + gen_logs "Ioncube extension already installed." msg fi fi - ############################## # Configure Php # ############################## if [ $modsel -lt 8 ]; then - if [ -f $php_inidir/php.ini ]; then - sed -i '/allow_url_fopen/c\allow_url_fopen=on' $php_inidir/php.ini - sed -i '/max_execution_time/c\max_execution_time=360' $php_inidir/php.ini - sed -i '/max_input_time/c\max_input_time=1000' $php_inidir/php.ini - sed -i '/memory_limit/c\memory_limit=128M' $php_inidir/php.ini - sed -i '/post_max_size/c\post_max_size=32M' $php_inidir/php.ini - sed -i '/upload_max_filesize/c\upload_max_filesize=32M' $php_inidir/php.ini - echo "date.timezone=\"Europe/Berlin\"" >> $php_inidir/php.ini - fi - if [ -f $php_apachedir/php.ini ]; then - sed -i '/allow_url_fopen/c\allow_url_fopen=on' $php_apachedir/php.ini - sed -i '/max_execution_time/c\max_execution_time=360' $php_apachedir/php.ini - sed -i '/max_input_time/c\max_input_time=1000' $php_apachedir/php.ini - sed -i '/memory_limit/c\memory_limit=128M' $php_apachedir/php.ini - sed -i '/post_max_size/c\post_max_size=32M' $php_apachedir/php.ini - sed -i '/upload_max_filesize/c\upload_max_filesize=32M' $php_apachedir/php.ini - echo "date.timezone=\"Europe/Berlin\"" >> $php_apachedir/php.ini - fi - if [ -f $php_fpmdir/php.ini ]; then - sed -i '/allow_url_fopen/c\allow_url_fopen=on' $php_fpmdir/php.ini - sed -i '/max_execution_time/c\max_execution_time=360' $php_fpmdir/php.ini - sed -i '/max_input_time/c\max_input_time=1000' $php_fpmdir/php.ini - sed -i '/memory_limit/c\memory_limit=128M' $php_fpmdir/php.ini - sed -i '/post_max_size/c\post_max_size=32M' $php_fpmdir/php.ini - sed -i '/upload_max_filesize/c\upload_max_filesize=32M' $php_fpmdir/php.ini - echo "date.timezone=\"Europe/Berlin\"" >> $php_fpmdir/php.ini - fi - - if [ -f /etc/apache2/confixx_vhosts/web0.conf ]; then - sed -i '/allow_url_fopen/c\php_admin_flag allow_url_fopen on' /etc/apache2/confixx_vhosts/web0.conf - fi - - if [ -f /etc/apache2/confixx_mhost.conf ]; then - sed -i '/allow_url_fopen/c\php_admin_flag allow_url_fopen on' /etc/apache2/confixx_mhost.conf - fi + for ini in "$php_inidir/php.ini" "$php_apachedir/php.ini" "$php_fpmdir/php.ini"; do + if [ -f "$ini" ]; then + sed -i '/allow_url_fopen/c\allow_url_fopen=on' "$ini" + sed -i '/max_execution_time/c\max_execution_time=360' "$ini" + sed -i '/max_input_time/c\max_input_time=1000' "$ini" + sed -i '/memory_limit/c\memory_limit=128M' "$ini" + sed -i '/post_max_size/c\post_max_size=32M' "$ini" + sed -i '/upload_max_filesize/c\upload_max_filesize=32M' "$ini" + echo "date.timezone=\"Europe/Berlin\"" >> "$ini" + gen_logs "Updated PHP settings in $ini" msg + fi + done + + [ -f /etc/apache2/confixx_vhosts/web0.conf ] && \ + sed -i '/allow_url_fopen/c\php_admin_flag allow_url_fopen on' /etc/apache2/confixx_vhosts/web0.conf && \ + gen_logs "Updated allow_url_fopen in confixx_vhosts/web0.conf" msg + + [ -f /etc/apache2/confixx_mhost.conf ] && \ + sed -i '/allow_url_fopen/c\php_admin_flag allow_url_fopen on' /etc/apache2/confixx_mhost.conf && \ + gen_logs "Updated allow_url_fopen in confixx_mhost.conf" msg fi ############################## -# Restart Apache And Php # +# Restart Apache And PHP # ############################## -if [ $modsel -lt 8 ]; then +if [ "$modsel" -lt 8 ]; then if [ "$os_install" != "3" ]; then - service apache2 restart - service php5-fpm restart - service php${php_version}-fpm restart + # Restart Apache + if command -v systemctl >/dev/null 2>&1; then + systemctl restart apache2 + gen_logs "Apache2 restarted using systemctl" msg + else + service apache2 restart + gen_logs "Apache2 restarted using service" msg + fi + + # Restart PHP-FPM (if installed) + if systemctl list-units --type=service | grep -q "php${php_version}-fpm"; then + systemctl restart php${php_version}-fpm + gen_logs "PHP-FPM restarted using systemctl" msg + elif service "php${php_version}-fpm" status >/dev/null 2>&1; then + service php${php_version}-fpm restart + gen_logs "PHP-FPM restarted using service" msg + fi else - service httpd restart + # RHEL/CentOS/Fedora - Apache is httpd + if command -v systemctl >/dev/null 2>&1; then + systemctl restart httpd + gen_logs "httpd restarted using systemctl (RHEL/CentOS)" msg + else + service httpd restart + gen_logs "httpd restarted using service (RHEL/CentOS)" msg + fi fi fi - ############################## # Mail Check # ############################## @@ -1228,8 +1334,10 @@ if [ $modsel -lt 8 ]; then clear if [ "$modsel" != "7" ]; then zypper --non-interactive install postfix + gen_logs "Installed postfix using zypper (non-interactive)" "postfix" else - zypper install postfix + zypper install postfix + gen_logs "Installed postfix using zypper" "postfix" fi ;; '2') @@ -1239,16 +1347,22 @@ if [ $modsel -lt 8 ]; then debconf-set-selections <<< "postfix postfix/mailname string $host_name" debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'" apt-get install postfix -y + gen_logs "Installed postfix using apt-get -y" "postfix" else - apt-get install postfix + apt-get install postfix + gen_logs "Installed postfix using apt-get" "postfix" fi + gen_logs "systemctl enable postfix" cmd + gen_logs "systemctl restart postfix" cmd ;; '3') clear if [ "$modsel" != "7" ]; then yum install postfix -y + gen_logs "Installed postfix using yum -y" "postfix" else yum install postfix + gen_logs "Installed postfix using yum" "postfix" fi ;; esac @@ -1257,20 +1371,22 @@ if [ $modsel -lt 8 ]; then fi fi - ############################## # Install Qstat # ############################## if [ "$os_install" = "2" ]; then apt-get install qstat + gen_logs "Installed qstat from apt" msg if [ -f /usr/bin/qstat ]; then chmod 0755 /usr/bin/qstat cp /usr/bin/qstat / + gen_logs "Copied qstat to /" "qstat" fi if [ ! -f /usr/bin/qstat -a -f /usr/bin/quakestat ]; then chmod 0755 /usr/bin/quakestat cp /usr/bin/quakestat /usr/bin/qstat cp /usr/bin/qstat / + gen_logs "Fallback to quakestat as qstat" msg fi fi @@ -1278,39 +1394,38 @@ if [ ! -f /qstat ]; then cd $installhome if [ ! -f qstat.tar.gz ]; then wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase_qstat.tar.gz + gen_logs "Downloaded qstat package" msg tar -xzf tekbase_qstat.tar.gz rm tekbase_qstat.tar.gz else tar -xzf qstat.tar.gz - rm qstat.tar.gz + rm qstat.tar.gz fi - + cd qstat ./configure && make all install + gen_logs "Compiled and installed qstat" msg chmod 0755 qstat cp qstat /usr/bin cp qstat / - - if [ -d /var/www/empty ]; then - cp qstat /var/www/empty - fi - if [ -d /srv/www/empty ]; then - cp qstat /srv/www/empty - fi - if [ -d /home/www/empty ]; then - cp qstat /home/www/empty - fi + + if [ -d /var/www/empty ]; then cp qstat /var/www/empty; fi + if [ -d /srv/www/empty ]; then cp qstat /srv/www/empty; fi + if [ -d /home/www/empty ]; then cp qstat /home/www/empty; fi cd $installhome rm -r qstat - + if [ ! -f /qstat ]; then echo "Check qstat: error" >> /home/tekbase_status.txt + gen_logs "Qstat binary not found after install" msg else - echo "Check qstat: ok" >> /home/tekbase_status.txt + echo "Check qstat: ok" >> /home/tekbase_status.txt + gen_logs "Qstat installed successfully" msg fi else echo "Check qstat: ok" >> /home/tekbase_status.txt + gen_logs "Qstat already exists, skipping" msg fi @@ -1321,77 +1436,99 @@ if [ "$modsel" = "1" ] || [ "$modsel" = "2" ] || [ "$modsel" = "4" ] || [ "$mods if [ ! -f skripte.tar ]; then cd /home git clone https://github.com/teklab-de/tekbase-scripts-linux.git skripte - if [ ! -f /skripte/autoupdater ]; then - cd $installhome + gen_logs "Cloned tekbase-scripts-linux.git into /home/skripte" msg + if [ ! -f /home/skripte/autoupdater ]; then + cd $installhome wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase_scripts.tar tar -xzf tekbase_scripts.tar -C /home rm tekbase_scripts.tar + gen_logs "Downloaded and extracted tekbase_scripts.tar" msg fi - cd skripte - mkdir cache + # Ensure we are in /home/skripte + cd /home/skripte 2>/dev/null || { + echo "⚠️ /home/skripte does not exist" + exit 1 + } + + # Create the 'cache' directory if it doesn't exist + mkdir -p cache chmod 755 * chmod 777 cache + gen_logs "Prepared skripte folder with permissions and cache/" msg cd $installhome else tar -xzf skripte.tar -C /home - rm skripte.tar + rm skripte.tar + gen_logs "Extracted skripte.tar to /home" msg fi if [ ! -f hlstats.tar ]; then wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase_hlstats.tar tar -xzf tekbase_hlstats.tar -C /home/skripte rm tekbase_hlstats.tar + gen_logs "Downloaded and extracted tekbase_hlstats.tar" msg else tar -xzf hlstats.tar -C /home/skripte rm hlstats.tar + gen_logs "Extracted hlstats.tar to /home/skripte" msg fi - + userpwd=$(gen_passwd 8) useradd -g users -p $(perl -e 'print crypt("'$userpwd'","Sa")') -s /bin/bash -m user-webi -d /home/user-webi + gen_logs "Created user-webi with generated password" msg cd $installhome if [ ! -f user-webi.tar ]; then wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase_user-webi.tar tar -xzf tekbase_user-webi.tar -C /home rm tekbase_user-webi.tar + gen_logs "Downloaded and extracted tekbase_user-webi.tar" msg else tar -xzf user-webi.tar -C /home rm user-webi.tar + gen_logs "Extracted user-webi.tar to /home" msg fi + if [ ! -f keys.tar ]; then wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase_keys.tar tar -xzf tekbase_keys.tar -C /home/user-webi rm tekbase_keys.tar + gen_logs "Downloaded and extracted tekbase_keys.tar to /home/user-webi" msg else tar -xzf keys.tar -C /home/user-webi rm keys.tar + gen_logs "Extracted keys.tar to /home/user-webi" msg fi if [ -d /home/skripte ]; then echo "Check scripts: ok" >> /home/tekbase_status.txt + gen_logs "Script installation completed successfully." msg else - echo "Check scripts: error" >> /home/tekbase_status.txt + echo "Check scripts: error" >> /home/tekbase_status.txt + gen_logs "Script installation failed: /home/skripte not found." msg fi fi ############################## -# Configure Sudo # +# Configure Sudo (Safe Way) # ############################## -if [ "$modsel" = "1" ] || [ "$modsel" = "2" ] || [ "$modsel" = "4" ] || [ "$modsel" = "5" ] || [ "$modsel" = "8" ] || [ "$modsel" = "9" ]; then +if [[ "$modsel" =~ ^(1|2|4|5|8|9)$ ]]; then if [ "$os_install" = "3" ]; then cp /etc/sudoers /etc/sudoers.tekbase - rm /etc/sudoers - echo "root ALL=(ALL) ALL" >> /etc/sudoers - else - sed -i '/^user-webi*/d' /etc/sudoers - fi - - echo "user-webi ALL=(ALL) NOPASSWD: /home/skripte/" >> /etc/sudoers - echo "user-webi ALL=(ALL) NOPASSWD: /usr/bin/useradd" >> /etc/sudoers - echo "user-webi ALL=(ALL) NOPASSWD: /usr/bin/usermod" >> /etc/sudoers - echo "user-webi ALL=(ALL) NOPASSWD: /usr/bin/userdel" >> /etc/sudoers - chmod 0400 /etc/sudoers + echo "root ALL=(ALL:ALL) ALL" > /etc/sudoers + chmod 0440 /etc/sudoers + gen_logs "Reset sudoers for CentOS/RHEL safely." msg + fi + + rm -f /etc/sudoers.d/user-webi + + cat < /etc/sudoers.d/user-webi +user-webi ALL=(ALL) NOPASSWD: /home/skripte/tekbase, /usr/bin/useradd, /usr/bin/usermod, /usr/bin/userdel +EOF + + chmod 0440 /etc/sudoers.d/user-webi + gen_logs "Configured /etc/sudoers.d/user-webi with proper permissions." msg fi @@ -1406,8 +1543,10 @@ if [ "$modsel" = "1" ] || [ "$modsel" = "2" ] || [ "$modsel" = "4" ] || [ "$mods echo "Check sudo: ok" >> /home/tekbase_status.txt userdel tekbasewi rm -r /home/tekbasewi + gen_logs "Sudo test passed — user-webi can run tekbase as root." msg else - echo "Check sudo: error" >> /home/tekbase_status.txt + echo "Check sudo: error" >> /home/tekbase_status.txt + gen_logs "Sudo test failed — user-webi could not execute tekbase." msg fi fi @@ -1436,6 +1575,12 @@ if [ "$install_ftp" = "1" ]; then else zypper install vsftpd fi + if command -v systemctl >/dev/null 2>&1; then + systemctl enable vsftpd + systemctl restart vsftpd + else + service vsftpd restart + fi fi if [ "$os_install" = "2" ]; then if [ "$modsel" != "7" ]; then @@ -1445,6 +1590,14 @@ if [ "$install_ftp" = "1" ]; then else apt-get install proftpd fi + + if command -v systemctl >/dev/null 2>&1; then + systemctl enable --now proftpd + gen_logs "Enabled and started ProFTPD with systemctl" msg + else + service proftpd restart + gen_logs "Restarted ProFTPD with service" msg + fi fi if [ "$os_install" = "3" ]; then if [ "$modsel" != "7" ]; then @@ -1457,485 +1610,548 @@ fi ############################## -# Configure Ftp # +# Configure FTP # ############################## -if [ -f /etc/proftpd.conf -o -f /etc/proftpd/proftpd.conf ]; then + +# --- ProFTPD setup --- +if systemctl list-units --type=service | grep -q proftpd; then + # Determine proftpd config path if [ -f /etc/proftpd.conf ]; then ftp_file="/etc/proftpd.conf" - fi - if [ -f /etc/proftpd/proftpd.conf ]; then + elif [ -f /etc/proftpd/proftpd.conf ]; then ftp_file="/etc/proftpd/proftpd.conf" + else + # Create default config if missing + mkdir -p /etc/proftpd + ftp_file="/etc/proftpd/proftpd.conf" + cat > "$ftp_file" <> $ftp_file - echo "" >> $ftp_file - fi - - sed -i '/^UseReverseDNS*/d' $ftp_file - sed -i '/^IdentLookups*/d' $ftp_file - sed -i '/^DefaultRoot*/d' $ftp_file - sed -i '/^AuthGroupFile*/d' $ftp_file - sed -i '/^AllowOverwrite*/d' $ftp_file - sed -i '/^AuthUserFile*/d' $ftp_file - sed -i '/^RequireValidShell*/d' $ftp_file - sed -i '/^AuthOrder*/d' $ftp_file - - echo "AllowOverwrite on" >> $ftp_file - echo "UseReverseDNS off" >> $ftp_file - #echo "IdentLookups off" >> $ftp_file - echo "DefaultRoot ~" >> $ftp_file - echo "RequireValidShell off" >> $ftp_file - echo "AuthOrder mod_auth_pam.c mod_auth_unix.c" >> $ftp_file - #echo "AuthUserFile /etc/proftpd/ftpd.passwd" >> $ftp_file - #echo "AuthGroupFile /etc/proftpd/ftpd.group" >> $ftp_file - - service proftpd restart - service xinetd restart - echo "Check proftpd: ok" >> /home/tekbase_status.txt -else - if [ ! -f /etc/vsftpd.conf ]; then + grep -Fxf proftpd_settings.cfg "$ftp_file" >/dev/null 2>&1 || { + cat proftpd_settings.cfg >> "$ftp_file" + echo "" >> "$ftp_file" + } + fi + + # Clean duplicate or conflicting entries + sed -i '/^UseReverseDNS*/d' "$ftp_file" + sed -i '/^IdentLookups*/d' "$ftp_file" + sed -i '/^DefaultRoot*/d' "$ftp_file" + sed -i '/^AuthGroupFile*/d' "$ftp_file" + sed -i '/^AllowOverwrite*/d' "$ftp_file" + sed -i '/^AuthUserFile*/d' "$ftp_file" + sed -i '/^RequireValidShell*/d' "$ftp_file" + sed -i '/^AuthOrder*/d' "$ftp_file" + + # Apply base TekBASE overrides + { + echo "AllowOverwrite on" + echo "UseReverseDNS off" + echo "DefaultRoot ~" + echo "RequireValidShell off" + echo "AuthOrder mod_auth_pam.c mod_auth_unix.c" + } >> "$ftp_file" + + systemctl restart proftpd + + if systemctl is-active --quiet proftpd; then + echo "Check proftpd: ok" >> /home/tekbase_status.txt + else echo "Check proftpd: error" >> /home/tekbase_status.txt fi +else + echo "Check proftpd: not installed" >> /home/tekbase_status.txt fi +# --- VSFTPD setup --- if [ -f /etc/vsftpd.conf ]; then cp /etc/vsftpd.conf /etc/vsftpd.tekbase - - sed -i '/write_enable*/c\write_enable=YES' /etc/vsftpd.conf - sed -i '/chroot_local_user*/c\chroot_local_user=YES' /etc/vsftpd.conf - sed -i '/userlist_enable*/c\userlist_enable=NO' /etc/vsftpd.conf - - service vsftpd restart - service xinetd restart - echo "Check vsftp: ok" >> /home/tekbase_status.txt + + sed -i 's/^write_enable=.*/write_enable=YES/' /etc/vsftpd.conf + sed -i 's/^chroot_local_user=.*/chroot_local_user=YES/' /etc/vsftpd.conf + sed -i 's/^userlist_enable=.*/userlist_enable=NO/' /etc/vsftpd.conf + + systemctl restart vsftpd + + if systemctl is-active --quiet vsftpd; then + echo "Check vsftpd: ok" >> /home/tekbase_status.txt + else + echo "Check vsftpd: error" >> /home/tekbase_status.txt + fi else - echo "Check vsftpd: error" >> /home/tekbase_status.txt + echo "Check vsftpd: not installed" >> /home/tekbase_status.txt fi +############################## +# Configure TS3 Firewall # +############################## +function configure_ts3_firewall { + local ts3_ports_udp=(9987) + local ts3_ports_tcp=(10011 30033) + local firewall_set=0 + + gen_logs "Configuring firewall for TeamSpeak 3" msg + + if command -v ufw >/dev/null 2>&1; then + firewall_set=1 + for port in "${ts3_ports_udp[@]}"; do + gen_logs "ufw allow $port/udp" cmd + done + for port in "${ts3_ports_tcp[@]}"; do + gen_logs "ufw allow $port/tcp" cmd + done + gen_logs "Opened TS3 ports using ufw" msg + + elif command -v firewall-cmd >/dev/null 2>&1; then + firewall_set=1 + for port in "${ts3_ports_udp[@]}"; do + gen_logs "firewall-cmd --permanent --add-port=$port/udp" cmd + done + for port in "${ts3_ports_tcp[@]}"; do + gen_logs "firewall-cmd --permanent --add-port=$port/tcp" cmd + done + gen_logs "firewall-cmd --reload" cmd + gen_logs "Opened TS3 ports using firewalld" msg + + elif command -v iptables >/dev/null 2>&1; then + firewall_set=1 + for port in "${ts3_ports_udp[@]}"; do + if ! iptables -C INPUT -p udp --dport "$port" -j ACCEPT 2>/dev/null; then + gen_logs "iptables -A INPUT -p udp --dport $port -j ACCEPT" cmd + fi + done + for port in "${ts3_ports_tcp[@]}"; do + iptables -C INPUT -p tcp --dport "$port" -j ACCEPT 2>/dev/null || gen_logs "iptables -A INPUT -p tcp --dport $port -j ACCEPT" cmd + done + gen_logs "Opened TS3 ports using iptables" msg + fi + + if [ "$firewall_set" -eq 0 ]; then + gen_logs "No firewall found. Attempting to install iptables..." msg + case "$os_install" in + 1) gen_logs "zypper --non-interactive install iptables" cmd ;; + 2) gen_logs "apt-get install -y iptables" cmd ;; + 3) gen_logs "yum install -y iptables" cmd ;; + esac + if command -v iptables >/dev/null 2>&1; then + gen_logs "iptables installed successfully" msg + configure_ts3_firewall + else + gen_logs "Failed to install iptables firewall" msg + fi + fi +} ############################## # Install Teamspeak 3 # ############################## if [ "$modsel" = "1" ] || [ "$modsel" = "4" ] || [ "$modsel" = "8" ]; then - cd $installhome + cd "$installhome" adminpwd=$(gen_passwd 8) - - ps -u user-webi | grep ts3server | awk '{print $1}' | while read pid; do - kill $pid - done - - if [ -f /home/user-webi/teamspeak3/ts3server_startscript.sh ]; then - cd /home/user-webi - if [ -f /home/user-webi/teamspeak3_backup/ts3server_startscript.sh ]; then - rm -r teamspeak3_backup - fi - mv teamspeak3 teamspeak3_backup - cd $installhome + + pkill -u user-webi ts3server 2>/dev/null || true + + if [ -d /home/user-webi/teamspeak3 ]; then + mv /home/user-webi/teamspeak3 /home/user-webi/teamspeak3_backup + gen_logs "Backed up old TeamSpeak install" msg fi - - if [ "$os_typ" = "x86_64" ]; then - ts_arch="amd64" + + ts_arch=$( [ "$os_typ" = "x86_64" ] && echo "amd64" || echo "x86" ) + fixed_ts_version="3.13.7" + ts_file="teamspeak3-server_linux_${ts_arch}-${fixed_ts_version}.tar.bz2" + ts_url="https://files.teamspeak-services.com/releases/server/${fixed_ts_version}/${ts_file}" + + if command -v curl >/dev/null; then + gen_logs "curl -O $ts_url" cmd + elif command -v wget >/dev/null; then + gen_logs "wget $ts_url" cmd else - ts_arch="x86" + gen_logs "curl or wget not found — cannot download TeamSpeak" msg + exit 1 fi - - for i in $(curl -s "http://dl.4players.de/ts/releases/?C=M;O=D" | grep -Po '(?<=href=")[0-9]+(\.[0-9]+){2,3}(?=/")' | sort -Vr); do - ts_url="http://dl.4players.de/ts/releases/$i/teamspeak3-server_linux_$ts_arch-$i.tar.bz2" - check=$(curl -I $ts_url 2>&1 | grep "HTTP/" | awk '{print $2}') - if [ "$check" = "200" ]; then - break - else - $ts_url - fi - done - if [ "$check" = "200" -a "$ts_url" != "" ]; then - curl $ts_url -o teamspeak3-server.tar.bz2 - tar -xjf teamspeak3-server.tar.bz2 - rm teamspeak3-server.tar.bz2 - if [ "$os_typ" = "x86_64" ]; then - mv teamspeak3-server_linux_amd64 /home/user-webi/teamspeak3 - else - mv teamspeak3-server_linux_x86 /home/user-webi/teamspeak3 - fi - fi - - if [ -f /home/user-webi/teamspeak3/ts3server_startscript.sh ]; then - if [ "$os_typ" = "x86_64" ]; then - tar -xzf teamspeak3-server_linux-x86-64.tar.gz - mv teamspeak3-server_linux-amd64 /home/user-webi/teamspeak3 - else - tar -xzf teamspeak3-server_linux-x86.tar.gz - mv teamspeak3-server_linux-x86 /home/user-webi/teamspeak3 - fi - fi - + gen_logs "tar -xjf $ts_file" cmd + rm -f "$ts_file" + mv "teamspeak3-server_linux_${ts_arch}" /home/user-webi/teamspeak3 chown -R user-webi:users /home/user-webi/teamspeak3 + cd /home/user-webi/teamspeak3 su user-webi -c "touch .ts3server_license_accepted" - su user-webi -c "./ts3server_startscript.sh start serveradmin_password=$adminpwd create_default_virtualserver=0 createinifile=1 inifile=ts3server.ini > tsout.txt" - clear - if [ "$langsel" = "1" ]; then - echo "Teamspeak wird jetzt konfiguriert." - else - echo "Teamspeak will now be configured." - fi - loading 25 + + # Remove stale pid and lock files that may block startup + rm -f /home/user-webi/teamspeak3/ts3server.pid + rm -f /dev/shm/7* 2>/dev/null || true + + su user-webi -c "./ts3server_startscript.sh start serveradmin_password=$adminpwd createinifile=1 inifile=ts3server.ini > tsout.txt 2>&1" + sleep 20 su user-webi -c "./ts3server_startscript.sh stop" - grep -i "token=" tsout.txt | awk '{print $1}' > /home/tekbase_ts3.txt + sleep 5 + pkill -u user-webi ts3server 2>/dev/null || true + + token=$(awk -F= '/token=/{print $2}' tsout.txt | tr -d '[:space:]') + if [ -n "$token" ]; then + echo "Token: $token" > /home/tekbase_ts3.txt + gen_logs "TeamSpeak token extracted and saved" msg + else + echo "No token generated." > /home/tekbase_ts3.txt + gen_logs "Failed to extract TeamSpeak token" msg + fi + + cat > ts3server.ini <> query_ip_whitelist.txt - echo "$local_ip" >> query_ip_whitelist.txt - echo "machine_id=" >> ts3server.ini - echo "default_voice_port=9987" >> ts3server.ini - echo "voice_ip=0.0.0.0" >> ts3server.ini - echo "licensepath=" >> ts3server.ini - echo "filetransfer_port=30033" >> ts3server.ini - echo "filetransfer_ip=0.0.0.0" >> ts3server.ini - echo "query_port=10011" >> ts3server.ini - echo "query_ip=0.0.0.0" >> ts3server.ini - echo "query_ip_whitelist=query_ip_whitelist.txt" >> ts3server.ini - echo "query_ip_blacklist=query_ip_blacklist.txt" >> ts3server.ini - echo "dbplugin=ts3db_sqlite3" >> ts3server.ini - echo "dbpluginparameter=" >> ts3server.ini - echo "dbsqlpath=sql/" >> ts3server.ini - echo "dbsqlcreatepath=create_sqlite/" >> ts3server.ini - echo "dbconnections=10" >> ts3server.ini - echo "logpath=logs" >> ts3server.ini - echo "logquerycommands=0" >> ts3server.ini - echo "dbclientkeepdays=30" >> ts3server.ini - echo "logappend=0" >> ts3server.ini - echo "query_skipbruteforcecheck=0" >> ts3server.ini - echo "create_default_virtualserver=0" >> ts3server.ini + echo -e "127.0.0.1\n$local_ip" > query_ip_whitelist.txt + + configure_ts3_firewall + su user-webi -c "./ts3server_startscript.sh start inifile=ts3server.ini" + sleep 10 + + if pgrep -u user-webi ts3server >/dev/null; then + gen_logs "TeamSpeak started successfully" msg + echo "Check teamspeak: ok" >> /home/tekbase_status.txt + else + gen_logs "TeamSpeak failed to start" msg + echo "Check teamspeak: error" >> /home/tekbase_status.txt + fi echo "Admin Login: serveradmin" >> /home/tekbase_ts3.txt echo "Admin Password: $adminpwd" >> /home/tekbase_ts3.txt fi - ############################## # Install Linux Daemon # ############################## -if [ "$modsel" = "1" ] || [ "$modsel" = "2" ] || [ "$modsel" = "4" ] || [ "$modsel" = "5" ] || [ "$modsel" = "8" ] || [ "$modsel" = "9" ]; then +if [[ "$modsel" =~ ^(1|2|4|5|8|9)$ ]]; then cd /home/skripte daemonpwd=$(gen_passwd 8) daemonport=1500 - sed -i '/password*/c\password = '$daemonpwd'' tekbase.cfg - sed -i '/listen_port*/c\listen_port = '$daemonport'' tekbase.cfg - portcheck=1 - while [ "$portcheck" != "" ]; do - daemonport=$((daemonport+1)) - + sed -i '/^password[[:space:]]*=/c\password = '"$daemonpwd"'' tekbase.cfg + sed -i '/^listen_port[[:space:]]*=/c\listen_port = '"$daemonport"'' tekbase.cfg + gen_logs "Set initial daemon password and port (1500)" msg + + while true; do + daemonport=$((daemonport + 1)) if [ "$netstat_inst" = "1" ]; then - portcheck=$(netstat -tlpn | grep ":$daemonport ") + portcheck=$(netstat -tlpn 2>/dev/null | grep -w ":$daemonport") else - portcheck=$(ss -tlpn | grep ":$daemonport ") + portcheck=$(ss -tlpn 2>/dev/null | grep -w ":$daemonport") fi - if [ "$portcheck" = "" ]; then - sed -i '/listen_port*/c\listen_port = '$daemonport'' tekbase.cfg + if [ -z "$portcheck" ]; then + sed -i '/^listen_port[[:space:]]*=/c\listen_port = '"$daemonport"'' tekbase.cfg + gen_logs "Free port $daemonport selected for daemon" msg + break fi done + echo "Daemon Port: $daemonport" > /home/tekbase_daemon.txt echo "Daemon Password: $daemonpwd" >> /home/tekbase_daemon.txt + gen_logs "Daemon credentials saved" msg fi - ############################## # Configure WWW # ############################## -if [ $modsel -lt 8 ]; then +if [ "$modsel" -lt 8 ]; then wwwok=0 - site_url=$host_name - - if [ -d /home/www/web0/html ]; then - wwwpath="/var/www/web0/html" - wwwok=1 - fi - - if [ "$wwwok" = "0" ]; then - if [ -d /var/www/vhosts/$site_url/httpdocs ]; then - wwwpath="/var/www/vhosts/$site_url/httpdocs" - wwwok=1 - fi - fi - if [ "$wwwok" = "0" ]; then - if [ -d /var/www/vhosts/default/htdocs ]; then - wwwpath="/var/www/vhosts/default/htdocs" + possible_paths=( + "/home/www/web0/html:/var/www/web0/html" + "/var/www/vhosts/$host_name/httpdocs" + "/var/www/vhosts/default/htdocs" + "/var/www/virtual/default" + "/srv/www/vhosts/$host_name/httpdocs" + "/srv/www/vhosts/default/htdocs" + "/srv/www/virtual/default" + "/var/www/htdocs" + "/srv/www/web0/html" + "/srv/www/htdocs" + "/srv/www" + "/var/www/html" + "/var/www" + ) + + for path_entry in "${possible_paths[@]}"; do + base_path="${path_entry%%:*}" + real_path="${path_entry##*:}" + + if [ -d "$base_path" ]; then + wwwpath="${real_path:-$base_path}" wwwok=1 + gen_logs "Web path found and selected: $wwwpath" msg + break fi - fi - + done + + # ⬇️ Extra fallback logic (from older version) if [ "$wwwok" = "0" ]; then - if [ -d /var/www/virtual/default ]; then - wwwpath="/var/www/virtual/default" - wwwok=1 + site_url="$host_name" + + [ -d /home/www/web0/html ] && wwwpath="/var/www/web0/html" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /var/www/vhosts/$site_url/httpdocs ] && wwwpath="/var/www/vhosts/$site_url/httpdocs" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /var/www/vhosts/default/htdocs ] && wwwpath="/var/www/vhosts/default/htdocs" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /var/www/virtual/default ] && wwwpath="/var/www/virtual/default" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /var/www/web0/html ] && wwwpath="/var/www/web0/html" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /srv/www/vhosts/$site_url/httpdocs ] && wwwpath="/srv/www/vhosts/$site_url/httpdocs" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /srv/www/vhosts/default/htdocs ] && wwwpath="/srv/www/vhosts/default/htdocs" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /srv/www/virtual/default ] && wwwpath="/srv/www/virtual/default" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /var/www/htdocs ] && wwwpath="/var/www/htdocs" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /srv/www/web0/html ] && wwwpath="/srv/www/web0/html" && wwwok=1 + [ "$wwwok" = "0" ] && [ -d /srv/www/htdocs ] && wwwpath="/srv/www/htdocs" && wwwok=1 + if [ "$wwwok" = "0" ] && [ -d /srv/www ]; then + wwwpath="/srv/www" + wwwok=1 + [ -n "$local_ip" ] && site_url="$local_ip" fi - fi - - if [ "$wwwok" = "0" ]; then - if [ -d /var/www/web0/html ]; then - wwwpath="/var/www/web0/html" + if [ "$wwwok" = "0" ] && [ -d /var/www/html ]; then + wwwpath="/var/www/html" wwwok=1 + [ -n "$local_ip" ] && site_url="$local_ip" fi - fi - - if [ "$wwwok" = "0" ]; then - if [ -d /srv/www/vhosts/$site_url/httpdocs ]; then - wwwpath="/srv/www/vhosts/$site_url/httpdocs" - wwwok=1 + if [ "$wwwok" = "0" ] && [ -d /var/www ]; then + wwwpath="/var/www" + wwwok=1 + [ -n "$local_ip" ] && site_url="$local_ip" fi - fi - - if [ "$wwwok" = "0" ]; then - if [ -d /srv/www/vhosts/default/htdocs ]; then - wwwpath="/srv/www/vhosts/default/htdocs" - wwwok=1 + if [ "$wwwok" = "0" ]; then + if [ "$os_install" = "1" ]; then + mkdir -p /srv/www + wwwpath="/srv/www" + else + mkdir -p /var/www + wwwpath="/var/www" + fi + [ -n "$local_ip" ] && site_url="$local_ip" fi + gen_logs "Fallback logic selected path: $wwwpath" msg fi - if [ "$wwwok" = "0" ]; then - if [ -d /srv/www/virtual/default ]; then - wwwpath="/srv/www/virtual/default" - wwwok=1 - fi - fi + chk_panel - if [ "$wwwok" = "0" ]; then - if [ -d /var/www/htdocs ]; then - wwwpath="/var/www/htdocs" - wwwok=1 - fi - fi - - if [ "$wwwok" = "0" ]; then - if [ -d /srv/www/web0/html ]; then - wwwpath="/srv/www/web0/html" - wwwok=1 - fi - fi - - if [ "$wwwok" = "0" ]; then - if [ -d /srv/www/htdocs ]; then - wwwpath="/srv/www/htdocs" - wwwok=1 - fi - fi - - if [ "$wwwok" = "0" ]; then - if [ -d /srv/www ]; then - wwwpath="/srv/www" - wwwok=1 - if [ "$local_ip" != "" ]; then - site_url=$local_ip - fi + # Plesk handling + if [ "$web_panel" = "Plesk" ] && [ -d /var/www/vhosts ]; then + select_url "/var/www/vhosts" + wwwpath="/var/www/vhosts/$site_url/httpdocs" + gen_logs "Plesk panel detected, selected path: $wwwpath" msg + else + # Use IP as fallback site_url + if [ -z "$site_url" ]; then + site_url="$local_ip" + gen_logs "Using local_ip as site_url: $site_url" msg fi - fi - if [ "$wwwok" = "0" ]; then - if [ -d /var/www/html ]; then - wwwpath="/var/www/html" - wwwok=1 - if [ "$local_ip" != "" ]; then - site_url=$local_ip - fi + # Apache VHost auto-creation + if [[ "$web_panel" = "0" ]]; then + vhost_file="/etc/apache2/sites-available/$site_url.conf" + if [ ! -f "$vhost_file" ]; then + mkdir -p "$wwwpath" + cat < "$vhost_file" + + ServerName $site_url + DocumentRoot "$wwwpath" + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + ErrorLog \${APACHE_LOG_DIR}/$site_url-error.log + CustomLog \${APACHE_LOG_DIR}/$site_url-access.log combined + +EOF + a2ensite "$site_url.conf" + systemctl reload apache2 + gen_logs "Created Apache vhost for $site_url and reloaded Apache" msg + fi fi fi - if [ "$wwwok" = "0" ]; then - if [ -d /var/www ]; then - wwwpath="/var/www" - wwwok=1 - if [ "$local_ip" != "" ]; then - site_url=$local_ip - fi - fi - fi - - if [ "$wwwok" = "0" ]; then - if [ "$os_install" = "1" ]; then - mkdir /srv/www - wwwpath="/srv/www" - else - mkdir /var/www - wwwpath="/var/www" - fi - if [ "$local_ip" != "" ]; then - site_url=$local_ip - fi - fi - - chk_panel - if [ "$web_panel" = "Plesk" -a -d /var/www/vhosts ]; then - select_url "/var/www/vhosts" - wwwpath="/var/www/vhosts/$site_url/httpdocs" - fi + echo "Selected site URL: $site_url" + echo "Web root path: $wwwpath" fi - ############################## # Plesk # ############################## -if [ $modsel -lt 8 ]; then - if [ "$web_panel" = "Plesk" -a -d /var/www/vhosts ]; then - if [ "$os_install" = "2" ]; then - for i in libgeoip-dev geoip-bin geoip-database libssh2-1-dev; do - apt-get install $i $chkyes - done - fi - - cd /opt/plesk/php - for phpd in $(find * -maxdepth 0 -type d) - do - if [ "$(grep -E '^([0-9].[0-9])$' <<< $phpd)" != "" ]; then - phpv=${phpd//.} - if [ "$phpv" = "56" ]; then - if [ -d /opt/plesk/php/${phpd}/bin ]; then - for i in plesk-php${phpv}-dev plesk-php${phpv}-gd plesk-php${phpv}-mbstring plesk-php${phpv}-mysql plesk-php${phpv}-xml; do - apt-get install $i $chkyes - done - /opt/plesk/php/${phpd}/bin/pecl install https://pecl.php.net/get/ssh2-0.13.tgz - if [ -f /opt/plesk/php/${phpd}/lib/php/modules/ssh2.so ]; then - echo "extension=ssh2.so" > /opt/plesk/php/${phpd}/etc/php.d/ssh2.ini - fi - /opt/plesk/php/${phpd}/bin/pecl install http://pecl.php.net/get/geoip-1.1.1.tgz - if [ -f /opt/plesk/php/${phpd}/lib/php/modules/geoip.so ]; then - echo "extension=geoip.so" > /opt/plesk/php/${phpd}/etc/php.d/geoip.ini - fi - /etc/init.d/plesk-php${phpv}-fpm restart - fi - - else - if [ -d /opt/plesk/php/${phpd}/bin ]; then - for i in plesk-php${phpv}-dev plesk-php${phpv}-gd plesk-php${phpv}-mbstring plesk-php${phpv}-mysql plesk-php${phpv}-xml; do - apt-get install $i $chkyes - done - /opt/plesk/php/${phpd}/bin/pecl install https://pecl.php.net/get/ssh2-1.1.2.tgz - if [ -f /opt/plesk/php/${phpd}/lib/php/modules/ssh2.so ]; then - echo "extension=ssh2.so" > /opt/plesk/php/${phpd}/etc/php.d/ssh2.ini - fi - /opt/plesk/php/${phpd}/bin/pecl install http://pecl.php.net/get/geoip-1.1.1.tgz - if [ -f /opt/plesk/php/${phpd}/lib/php/modules/geoip.so ]; then - echo "extension=geoip.so" > /opt/plesk/php/${phpd}/etc/php.d/geoip.ini - fi - /etc/init.d/plesk-php${phpv}-fpm restart - fi +if [ "$modsel" -lt 8 ] && [ "$web_panel" = "Plesk" ] && [ -d /var/www/vhosts ]; then + if [ "$os_install" = "2" ]; then + apt-get install -y libgeoip-dev geoip-bin geoip-database libssh2-1-dev + gen_logs "Installed Plesk dependencies (geoip, ssh2 libs)" msg + fi + + cd /opt/plesk/php + for phpd in */; do + phpd=${phpd%/} + if [[ "$phpd" =~ ^[0-9]+\.[0-9]+$ ]]; then + phpv=${phpd//.} + phpbin="/opt/plesk/php/${phpd}/bin" + phplib="/opt/plesk/php/${phpd}/lib/php/modules" + phpcfg="/opt/plesk/php/${phpd}/etc/php.d" + + if [ -d "$phpbin" ]; then + for pkg in dev gd mbstring mysql xml; do + apt-get install -y "plesk-php${phpv}-$pkg" + gen_logs "Installed plesk-php${phpv}-$pkg" msg + done + + "$phpbin/pecl" install -f ssh2-1.4.1 + [ -f "$phplib/ssh2.so" ] && echo "extension=ssh2.so" > "$phpcfg/ssh2.ini" + + if [[ "$phpd" == 5.* || "$phpd" == 7.* ]]; then + "$phpbin/pecl" install -f geoip-1.1.1 + [ -f "$phplib/geoip.so" ] && echo "extension=geoip.so" > "$phpcfg/geoip.ini" fi + + systemctl restart plesk-php${phpv}-fpm + gen_logs "Restarted plesk-php${phpv}-fpm" msg fi - done - fi + fi + done fi - ############################## # Install TekBASE # ############################## -if [ $modsel -lt 8 ]; then - cd $installhome +if [ "$modsel" -lt 8 ]; then + cd "$installhome" - if [ "$php_version" = "5.6" ] || [ "$php_version" = "7.0" ]; then + if [[ "$php_version" == "5.6" || "$php_version" == "7.0" ]]; then wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase_php56.zip + gen_logs "Downloaded TekBASE for PHP $php_version" msg else - wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase.zip + wget --no-check-certificate https://teklab.s3.amazonaws.com/tekbase.zip + gen_logs "Downloaded latest TekBASE" msg fi - unzip tekbase*.zip - rm tekbase*.zip - mv tekbase $wwwpath + unzip tekbase*.zip && rm tekbase*.zip + mkdir -p "$wwwpath/tekbase" + mv tekbase/* "$wwwpath/tekbase" + gen_logs "Moved TekBASE into $wwwpath/tekbase" msg tekpwd=$(gen_passwd 8) - tekdb=$(gen_passwd 4) - + tekdb=$(gen_passwd 4) + if [ "$os_install" = "2" ]; then - mysqlpwd=$(grep -i password /etc/mysql/debian.cnf | awk 'NR == 1 {print $3}') - mysqlusr=$(grep -i user /etc/mysql/debian.cnf | awk 'NR == 1 {print $3}') + # Use generated root password + if [ -f /home/tekbase_mysql.txt ]; then + mysqlpwd=$(awk -F': ' '/MySQL root password/ {print $2}' /home/tekbase_mysql.txt) + mysqlusr="root" + elif [ -s /etc/mysql/debian.cnf ]; then + mysqlpwd=$(awk '/password/ {print $3; exit}' /etc/mysql/debian.cnf) + mysqlusr=$(awk '/user/ {print $3; exit}' /etc/mysql/debian.cnf) + else + mysqlusr="root" + echo -e "\n⚠️ Could not read MySQL credentials. Please enter root password:" + read -r mysqlpwd + fi else - clear mysqlusr="root" - if [ "$mysqlpwd" = "" ]; then - if [ "$langsel" = "1" ]; then - echo "Bitte geben Sie das MySQL Root Passwort an, dies wurde Ihnen von" - echo "Ihrem Serveranbieter bereits genannt (Root Passwort vielleicht)." - echo "" - echo -n "Passwort: " - else - echo "Please input the MySQL Root password. You get this from from" - echo "your server provider (in example Root password)." - echo "" - echo -n "Password: " - fi - read mysqlpwd + if [ -z "$mysqlpwd" ]; then + echo -e "Please input the MySQL Root password:\n" + read -r mysqlpwd fi fi - Q1="SET sql_mode = '';" - Q2="CREATE DATABASE IF NOT EXISTS tekbase_$tekdb;" - Q3="GRANT ALL PRIVILEGES ON tekbase_$tekdb.* TO 'tekbase_$tekdb'@'localhost' IDENTIFIED BY '$tekpwd' WITH GRANT OPTION;" - Q4="FLUSH PRIVILEGES;" - SQL="${Q1}${Q2}${Q3}${Q4}" - - mysql --user=$mysqlusr --password=$mysqlpwd -e "$SQL" - mysql --user=tekbase_$tekdb --password=$tekpwd tekbase_$tekdb < $wwwpath/tekbase/install/database.sql - - rm -r $wwwpath/tekbase/install - - echo " $wwwpath/tekbase/config.php - echo "\$dbhost = \"localhost\";" >> $wwwpath/tekbase/config.php - echo "\$dbuname = \"tekbase_$tekdb\";" >> $wwwpath/tekbase/config.php - echo "\$dbpass = \"$tekpwd\";" >> $wwwpath/tekbase/config.php - echo "\$dbname = \"tekbase_$tekdb\";" >> $wwwpath/tekbase/config.php - echo "\$prefix = \"teklab\";" >> $wwwpath/tekbase/config.php - echo "\$dbtype = \"mysqli\";" >> $wwwpath/tekbase/config.php - echo "\$sitekey = \"$tekpwd\";" >> $wwwpath/tekbase/config.php - echo "\$gfx_chk = \"1\";" >> $wwwpath/tekbase/config.php - echo "\$ipv6 = \"1\";" >> $wwwpath/tekbase/config.php - echo "\$shopcodes = \"00000\";" >> $wwwpath/tekbase/config.php - echo "\$max_logins = \"7\";" >> $wwwpath/tekbase/config.php - echo "\$awidgetone = \"Members,group,members_all.php, ,3\";" >> $wwwpath/tekbase/config.php - echo "\$awidgetwo = \"TekLab News,news,teklab_rss_all.php, ,2\";" >> $wwwpath/tekbase/config.php - echo "\$awidgetthree = \"Admins,administrator,admins_all.php, ,1\";" >> $wwwpath/tekbase/config.php - echo "?>" >> $wwwpath/tekbase/config.php - - chmod 0777 $wwwpath/tekbase/cache - chmod 0777 $wwwpath/tekbase/pdf - chmod 0777 $wwwpath/tekbase/resources - chmod 0777 $wwwpath/tekbase/tmp - - useradd -g users -p $(perl -e 'print crypt("'$tekpwd'","Sa")') -s /bin/bash -m tekbaseftp -d $wwwpath/tekbase - chown -R tekbaseftp:users $wwwpath/tekbase - - echo "DB Login: tekbase_$tekdb" > /home/tekbase_db.txt - echo "DB Password: $tekpwd" >> /home/tekbase_db.txt - echo "FTP Login: tekbaseftp" > /home/tekbase_ftp.txt - echo "FTP Password: $tekpwd" >> /home/tekbase_ftp.txt + # Create DB and user + mysql --user="$mysqlusr" --password="$mysqlpwd" <> /home/tekbase_status.txt + fi + + cat < "$wwwpath/tekbase/config.php" + +EOF + + if [ -d "$wwwpath/tekbase" ]; then + chmod 0777 "$wwwpath/tekbase"/{cache,pdf,resources,tmp} + gen_logs "Permissions set on tekbase writable directories." msg + else + gen_logs "Directory $wwwpath/tekbase not found – cannot chmod." msg + fi + useradd -g users -p "$(perl -e 'print crypt("'$tekpwd'", "Sa")')" -s /bin/bash -m tekbaseftp -d "$wwwpath/tekbase" + chown -R tekbaseftp:users "$wwwpath/tekbase" + gen_logs "TekBASE config file created and permissions set" msg + + echo -e "DB Login: tekbase_$tekdb\nDB Password: $tekpwd" > /home/tekbase_db.txt + echo -e "FTP Login: tekbaseftp\nFTP Password: $tekpwd" > /home/tekbase_ftp.txt sleep 5 - wget -q -O - http://$site_url/tekbase/admin.php + if command -v systemctl >/dev/null 2>&1; then + gen_logs "systemctl reload apache2" cmd + else + gen_logs "service apache2 reload" cmd + fi + wget -q -O - "http://$site_url/tekbase/admin.php" + gen_logs "Triggered admin.php setup via HTTP" msg else - cd $installhome - rm -r tekbase + rm -rf "$installhome/tekbase" fi -wget -q --post-data "op=insert&$site_url" -O - http://licenses1.tekbase.de/wiauthorized.php +wget -q --post-data "op=insert&$site_url" -O - http://licenses1.tekbase.de/wiauthorized.php +gen_logs "License inserted for $site_url" msg ############################## # DB Inserts # @@ -1953,6 +2169,7 @@ if [ "$local_ip" != "" ]; then INSERT INTO teklab_rootserver (id, sshdaemon, daemonpasswd, path, sshuser, sshport, name, serverip, loadindex, apps, games, streams, voices, vserver, web, cpucores, active) VALUES (NULL, "0", "$daemonpwd", "/home/skripte", "user-webi", "$ssh_port", "$local_ip", "$local_ip", "500", "1", "1", "1", "1", "1", "1", "$cpu_threads", "1"); INSERT INTO teklab_teamspeak (id, serverip, queryport, admin, passwd, path, typ, rserverid) VALUES (NULL, "$local_ip", "10011", "serveradmin", "$adminpwd", "teamspeak3", "Teamspeak3", "1"); EOF + gen_logs "Inserted rootserver and Teamspeak info into TekBASE DB" msg fi @@ -1966,23 +2183,26 @@ if [ "$modsel" != "3" ] || [ "$modsel" != "6" ]; then fi if [ "$sshsel" = "1" ]; then if [ ! -d "/home/user-webi/.ssh" ]; then - mkdir "/home/user-webi/.ssh" + mkdir "/home/user-webi/.ssh" else rm -r "/home/user-webi/.ssh" - mkdir "/home/user-webi/.ssh" + mkdir "/home/user-webi/.ssh" + fi + + ssh-keygen -t rsa -b 4096 -N '' -f /home/user-webi/.ssh/id_rsa + cp /home/user-webi/.ssh/id_rsa.pub /home/user-webi/.ssh/authorized_keys + chown -R user-webi:users .ssh + chmod 0700 .ssh + + gen_logs "Generated SSH keys for user-webi" msg + + if [ $modsel -lt 8 ]; then + mv /home/user-webi/.ssh/id_rsa.* $wwwpath/tekbase/tmp + gen_logs "Moved private/public SSH keys to TekBASE tmp dir" msg fi - - ssh-keygen -t rsa -b 4096 -N '' -f /home/user-webi/.ssh/id_rsa - cp /home/user-webi/.ssh/id_rsa.pub /home/user-webi/.ssh/authorized_keys - chown -R user-webi:users .ssh - chmod 0700 .ssh - if [ $modsel -lt 8 ]; then - mv /home/user-webi/.ssh/id_rsa.* $wwwpath/tekbase/tmp - fi fi fi - ############################## # TekBASE 8.x compatibility # ############################## @@ -1991,7 +2211,7 @@ for FILE in $(find *.sh) do cp $FILE ${FILE%.sh} done - +gen_logs "Converted .sh scripts to TekBASE 8.x compatible format" msg ############################## # Finish # @@ -2000,6 +2220,8 @@ cd $installhome cd /usr/local rm ioncube_x86-64.tar.gz rm ioncube_x86.tar.gz +gen_logs "Cleaned up ioncube archives" msg + clear if [ $modsel -lt 8 ]; then if [ "$langsel" = "1" ]; then @@ -2026,6 +2248,7 @@ if [ $modsel -lt 8 ]; then echo "Rental/Buy versions get a FREE installation support." fi echo "" + gen_logs "TekBASE installation complete – Admin: http://$site_url/tekbase/admin.php" msg fi if [ "$modsel" = "1" ] || [ "$modsel" = "4" ] || [ "$modsel" = "8" ]; then @@ -2037,6 +2260,7 @@ if [ "$modsel" = "1" ] || [ "$modsel" = "4" ] || [ "$modsel" = "8" ]; then echo "Serveradmin password in /home/tekbase_ts3.txt" fi echo "" + gen_logs "Teamspeak 3 base server installed" msg fi if [ "$modsel" = "1" ] || [ "$modsel" = "2" ] || [ "$modsel" = "4" ] || [ "$modsel" = "5" ] || [ "$modsel" = "8" ] || [ "$modsel" = "9" ]; then @@ -2049,6 +2273,14 @@ if [ "$modsel" = "1" ] || [ "$modsel" = "2" ] || [ "$modsel" = "4" ] || [ "$mods echo "su user-webi" echo "cd /home/skripte" echo "screen -A -m -d -S tekbasedaemon ./server" + echo "" + echo "📄 Übersicht der generierten Dateien:" + [ -f /home/tekbase_mysql.txt ] && echo " ✔️ /home/tekbase_mysql.txt → MySQL Root-Passwort" + [ -f /home/tekbase_db.txt ] && echo " ✔️ /home/tekbase_db.txt → TekBASE Datenbank-Zugang" + [ -f /home/tekbase_ftp.txt ] && echo " ✔️ /home/tekbase_ftp.txt → FTP Zugangsdaten" + [ -f /home/tekbase_daemon.txt ] && echo " ✔️ /home/tekbase_daemon.txt → Linux Daemon Zugangsdaten" + [ -f /home/tekbase_ts3.txt ] && echo " ✔️ /home/tekbase_ts3.txt → Teamspeak Token & Admin" + [ -f /home/tekbase_status.txt ] && echo " ✔️ /home/tekbase_status.txt → Status aller Komponenten" else echo "The root server has been completely set up. The linux daemon" echo "credentials are in the file /home/tekbase_daemon.txt." @@ -2057,8 +2289,17 @@ if [ "$modsel" = "1" ] || [ "$modsel" = "2" ] || [ "$modsel" = "4" ] || [ "$mods echo "su user-webi" echo "cd /home/skripte" echo "screen -A -m -d -S tekbasedaemon ./server" + echo "" + echo "📄 Summary of generated files:" + [ -f /home/tekbase_mysql.txt ] && echo " ✔️ /home/tekbase_mysql.txt → MySQL root password" + [ -f /home/tekbase_db.txt ] && echo " ✔️ /home/tekbase_db.txt → TekBASE DB login" + [ -f /home/tekbase_ftp.txt ] && echo " ✔️ /home/tekbase_ftp.txt → FTP login credentials" + [ -f /home/tekbase_daemon.txt ] && echo " ✔️ /home/tekbase_daemon.txt → Linux Daemon credentials" + [ -f /home/tekbase_ts3.txt ] && echo " ✔️ /home/tekbase_ts3.txt → TeamSpeak token & admin" + [ -f /home/tekbase_status.txt ] && echo " ✔️ /home/tekbase_status.txt → Component installation status" fi echo "" + gen_logs "Linux daemon setup complete — startup instructions shown" msg fi if [ "$os_install" = "2" ]; then