#!/bin/bash # Eye Script validating current DB schema for ALT Linux/Debian/Ubuntu with PostgreSQL support # Version: 1.0 # set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Output functions print_info() { echo -e "${GREEN}[INFO]${NC} $1" } print_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_step() { echo -e "${BLUE}=== $1 ===${NC}" } # Check for root privileges check_root() { if [[ $EUID -ne 0 ]]; then print_error "This script must be run as root" print_error "Use: sudo $0" exit 1 fi } # Detect distribution and package manager detect_distro() { if [[ -f /etc/os-release ]]; then . /etc/os-release OS_ID=$ID OS_VERSION=$VERSION_ID OS_NAME=$NAME case $OS_ID in altlinux) PACKAGE_MANAGER="apt-get" SERVICE_MANAGER="systemctl" OS_FAMILY="alt" print_info "Detected ALT Linux $OS_VERSION" ;; debian) PACKAGE_MANAGER="apt" SERVICE_MANAGER="systemctl" OS_FAMILY="debian" print_info "Detected Debian $OS_VERSION" ;; ubuntu) PACKAGE_MANAGER="apt" SERVICE_MANAGER="systemctl" OS_FAMILY="debian" print_info "Detected Ubuntu $OS_VERSION" ;; *) print_error "Unsupported distribution: $OS_ID" print_error "Supported: ALT Linux, Debian, Ubuntu" exit 1 ;; esac else print_error "Failed to detect distribution" exit 1 fi } select_language() { print_step "Select Installation Language" if [ -n "${EYE_LANG}" ]; then return fi echo "Available languages:" echo "1) English" echo "2) Russian (default)" echo "" while true; do read -p "Select language (1 or 2) [2]: " lang_choice # Если пустой ввод - по умолчанию английский if [[ -z "$lang_choice" ]]; then lang_choice="2" fi # Обработка ввода (приводим к нижнему регистру) lang_choice_lower=$(echo "$lang_choice" | tr '[:upper:]' '[:lower:]') case $lang_choice_lower in 1|english|en|eng|анг|английский) EYE_LANG="english" EYE_LANG_SHORT="en" print_info "Selected English language" break ;; 2|russian|ru|rus|ру|русский) EYE_LANG="russian" EYE_LANG_SHORT="ru" print_info "Selected Russian language (Русский)" break ;; *) print_error "Invalid choice: '$lang_choice'" print_warn "Available options: 1 (English), 2 (Russian)" print_warn "You can also type: english, en, russian, ru" ;; esac done } # Настройка параметров подключения к БД (общая для local и remote) configure_database_connection() { echo "" echo "Local Database Configuration" echo "============================" if [[ "$DB_TYPE" == "postgresql" ]]; then DB_PORT="5432" else DB_PORT="3306" fi } # Configure MySQL setup_mysql() { print_step "Configuring MySQL" # Check MySQL access if ! command -v mysql &> /dev/null; then print_error "MySQL client not installed" return 1 fi MYSQL_OPT="-u root" # Check access without password if mysql -u root -e "SELECT 1;" 2>/dev/null; then print_info "MySQL accessible with empty password" echo "" print_warn "IMPORTANT: Need to set root password for MySQL!" print_warn "After installation run: mysql_secure_installation" echo "" else # Ask for password and create config file read -p "Enter MySQL root user password: " DB_ROOT_PASSWORD echo "" # Create temporary config file MYSQL_CNF_FILE="/tmp/mysql_root_eye.cnf" echo "[client]" > "$MYSQL_CNF_FILE" echo "user=root" >> "$MYSQL_CNF_FILE" echo "password=$DB_ROOT_PASSWORD" >> "$MYSQL_CNF_FILE" chmod 600 "$MYSQL_CNF_FILE" # Check connection if mysql --defaults-extra-file="$MYSQL_CNF_FILE" -e "SELECT 1;" &>/dev/null; then print_info "Successfully connected to MySQL" MYSQL_OPT="--defaults-extra-file=$MYSQL_CNF_FILE" else print_error "Incorrect MySQL root password" rm -f "$MYSQL_CNF_FILE" return 1 fi fi # === Проверка: существует ли база данных? === if mysql $MYSQL_OPT -sN -e "SHOW DATABASES;" | grep -q "^${DB_TEST}$"; then print_error "Database '$DB_TEST' already exists. The script has been stopped." exit 120 fi print_info "Creating database..." # Import main SQL file mysql $MYSQL_OPT </dev/null) fi if [[ -z "$DB_HOST" && -f "${PERL_CONFIG}" ]]; then # Извлекаем из Perl-конфига DB_HOST=$(grep -oP '^DBHOST=\K.*' ${PERL_CONFIG} 2>/dev/null) fi if [[ "$DB_HOST" == "127.0.0.1" || "$DB_HOST" == "localhost" || "$DB_HOST" == "::1" ]]; then DB_INSTALL="local" else echo "Remote database detected. Abort installation!" exit 100 fi # === Восстанавливаем DB_TYPE === if [[ -f "${PHP_CONFIG}" ]]; then DB_TYPE=$(grep -oP 'define\s*\(\s*"DB_TYPE"\s*,\s*"\K[^"]+' ${PHP_CONFIG} 2>/dev/null) # В PHP может быть 'pgsql' вместо 'postgresql' if [[ "$DB_TYPE" == "pgsql" ]]; then DB_TYPE="postgresql" elif [[ "$DB_TYPE" == "mysql" ]]; then DB_TYPE="mysql" fi elif [[ -f "${PERL_CONFIG}" ]]; then DB_TYPE=$(grep -oP '^DBTYPE=\K.*' ${PERL_CONFIG} 2>/dev/null) fi if [[ -f "$PHP_CONFIG" ]]; then # Извлекаем язык if HTML_LANG=$(grep -oP 'define\s*\(\s*"HTML_LANG"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null); then case "$HTML_LANG" in russian|ru) EYE_LANG="russian" ;; english|en) EYE_LANG="english" ;; esac fi # Извлекаем БД параметры DB_NAME=$(grep -oP 'define\s*\(\s*"DB_NAME"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null) DB_USER=$(grep -oP 'define\s*\(\s*"DB_USER"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null) DB_HOST=$(grep -oP 'define\s*\(\s*"DB_HOST"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null) DB_PASS=$(grep -oP 'define\s*\(\s*"DB_PASS"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null) fi # читаем из Perl-конфига === if [[ -z "$DB_NAME" || -z "$DB_USER" || -z "$DB_PASS" ]] && [[ -f "$PERL_CONFIG" ]]; then while IFS='=' read -r key value; do # Пропускаем комментарии и пустые строки [[ $key =~ ^#.*$ || -z $key ]] && continue case "$key" in DBNAME) DB_NAME="$value" ;; DBUSER) DB_USER="$value" ;; DBSERVER) DB_HOST="$value" ;; DBPASS) DB_PASS="$value" ;; esac done < "$PERL_CONFIG" fi if [ -z "${DB_TYPE}" ]; then DB_TYPE='mysql' fi # === Вывод результатов (для отладки или использования в других скриптах) === echo "EYE_LANG=$EYE_LANG" echo "DB_NAME=$DB_NAME" echo "DB_USER=$DB_USER" echo "DB_HOST=$DB_HOST" echo "DB_TYPE=$DB_TYPE" DB_TEST="${DB_NAME}_test" # Убедимся, что все необходимые параметры получены if [[ -z "$DB_NAME" || -z "$DB_USER" || -z "$DB_PASS" ]]; then print_error "Failed to extract database credentials from config files" exit 1 fi install_clear_db # Exit with success code exit 0