1
0
Эх сурвалжийг харах

draft migration to PostgreSQL

Dmitriev Roman 3 сар өмнө
parent
commit
d35eadc1f2

+ 525 - 0
docs/databases/migrate2psql.sh

@@ -0,0 +1,525 @@
+#!/bin/bash
+# Eye Migration Script for ALT Linux/Debian/Ubuntu with PostgreSQL support
+# Version: 2.1
+
+# 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 "============================"
+    DB_HOST="127.0.0.1"
+    DB_PORT="5432"
+    echo "Database server: $DB_HOST:$DB_PORT (local)"
+}
+
+# Install dependencies for ALT Linux
+install_deps_altlinux() {
+    print_step "Installing dependencies for ALT Linux"
+    apt-get update
+    # === Локальная база данных
+    apt-get install -y postgresql17 postgresql17-server postgresql17-contrib postgresql17-perl
+}
+
+# Install dependencies for Debian/Ubuntu
+install_deps_debian() {
+    print_step "Installing dependencies for Debian/Ubuntu"
+    apt-get update
+    # === Локальная база данных
+    apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
+}
+
+# System update
+update_system() {
+    print_step "Updating apt cache"
+    $PACKAGE_MANAGER update -y
+}
+
+upgrade_system() {
+    print_step "Updating system"
+    if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then
+        apt-get dist-upgrade -y
+    else
+        $PACKAGE_MANAGER upgrade -y
+    fi
+}
+
+# Install packages
+install_packages() {
+    print_step "Installing packages"
+
+    case $OS_FAMILY in
+        alt)
+            install_deps_altlinux
+            ;;
+        debian)
+            install_deps_debian
+            ;;
+    esac
+}
+
+# Configure PostgreSQL
+setup_postgresql() {
+    print_step "Configuring PostgreSQL"
+
+    PGDATA="/var/lib/pgsql/data"
+
+    # Для ALT Linux
+    if [[ "$OS_FAMILY" == "alt" ]]; then
+        echo "root ALL=(ALL:ALL) NOPASSWD: ALL" >/etc/sudoers.d/root
+        PGDATA="/var/lib/pgsql/data"
+
+        if [ -z "$(ls -A $PGDATA 2>/dev/null)" ]; then
+            /etc/init.d/postgresql initdb
+
+            # === ВАЖНО: настраиваем pg_hba.conf для безпарольного доступа ===
+            local pg_hba_file="$PGDATA/pg_hba.conf"
+            if [[ -f "$pg_hba_file" ]]; then
+                # Делаем резервную копию
+                cp "$pg_hba_file" "${pg_hba_file}.backup"
+
+                # Вставляем правило для пользователя 'postgres' в начало файла
+                # Это разрешит подключение без пароля через Unix-сокет
+                sed -i '1i\
+# Allow local postgres user without password\
+local   all             postgres                                peer\
+' "$pg_hba_file"
+
+                print_info "Configured pg_hba.conf to allow peer authentication for 'postgres'"
+            fi
+        fi
+
+        # Start and enable service
+        $SERVICE_MANAGER enable postgresql
+        $SERVICE_MANAGER restart postgresql
+    else
+        # Start and enable service
+        $SERVICE_MANAGER enable postgresql
+        $SERVICE_MANAGER start postgresql
+    fi
+
+    # Check PostgreSQL access
+    if ! command -v psql &> /dev/null; then
+        print_error "PostgreSQL client not installed"
+        return 1
+    fi
+
+    # Определяем локаль на основе языка
+    if [[ "$EYE_LANG" == "russian" ]]; then
+        LC_TYPE="ru_RU.UTF-8"
+    else
+        LC_TYPE="en_US.UTF-8"
+    fi
+
+    print_info "Creating database '$DB_NAME' with locale '$LC_TYPE'..."
+
+    # Set password for stat user
+    print_info "Setting password for user $DB_USER ..."
+    sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
+
+    sudo -u postgres createdb \
+      --encoding=UTF8 \
+      --lc-collate="$LC_TYPE" \
+      --lc-ctype="$LC_TYPE" \
+      --template=template0 \
+      --owner="$DB_USER" \
+      "$DB_NAME"
+
+    if [[ $? -ne 0 ]]; then
+        print_error "Failed to create database"
+        return 1
+    fi
+
+    print_info "Database created successfully with owner '$DB_USER'"
+
+    sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
+
+    # Теперь подключаемся как новый владелец для импорта
+    print_info "Importing database structure as '$DB_USER'..."
+
+    # Вариант 1: Используя sudo и переключение пользователя в psql
+    sudo -u postgres psql -d "$DB_NAME" <<EOF
+SET ROLE "$DB_USER";
+\i $SQL_CREATE_FILE
+EOF
+
+    if [[ $? -ne 0 ]]; then
+        print_error "Error importing create_db.sql"
+        return 1
+    fi
+
+    print_info "Database structure imported successfully"
+
+    # Дополнительные привилегии 
+    print_info "Setting up additional privileges..."
+
+    # Дать доступ пользователю postgres к БД
+    sudo -u postgres psql -c "GRANT CONNECT ON DATABASE $DB_NAME TO postgres;"
+
+    # Дать полные права пользователю postgres на все объекты
+    sudo -u postgres psql -d "$DB_NAME" <<EOF
+GRANT ALL ON SCHEMA public TO postgres;
+ALTER DEFAULT PRIVILEGES FOR USER "$DB_USER" IN SCHEMA public GRANT ALL ON TABLES TO postgres;
+ALTER DEFAULT PRIVILEGES FOR USER "$DB_USER" IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres;
+ALTER DEFAULT PRIVILEGES FOR USER "$DB_USER" IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres;
+EOF
+
+    print_info "Database setup completed successfully"
+
+    # Configure PostgreSQL for MD5 authentication
+    if [[ "$OS_FAMILY" == "alt" ]]; then
+        local pg_hba_file="/var/lib/pgsql/data/pg_hba.conf"
+        if [[ -f "$pg_hba_file" ]]; then
+            # Backup original
+            cp "$pg_hba_file" "${pg_hba_file}.backup"
+            # Add local md5 authentication if not present
+            if ! grep -q "local.*$DB_NAME.*md5" "$pg_hba_file"; then
+                echo "local   $DB_NAME            $DB_USER                                    scram-sha-256" >> "$pg_hba_file"
+                print_info "Added MD5 authentication for $DB_USER user in pg_hba.conf"
+                fi
+            fi
+        else
+        local pg_hba_file="/etc/postgresql/$(ls /etc/postgresql/ | head -1)/main/pg_hba.conf"
+        if [[ -f "$pg_hba_file" ]]; then
+            # Backup original
+            cp "$pg_hba_file" "${pg_hba_file}.backup"
+            # Add local md5 authentication if not present
+            if ! grep -q "local.*$DB_NAME.*md5" "$pg_hba_file"; then
+                echo "local   $DB_NAME            $DB_USER                                    scram-sha-256" >> "$pg_hba_file"
+                print_info "Added MD5 authentication for $DB_USER user in pg_hba.conf"
+                fi
+            fi
+        fi
+
+    # Restart PostgreSQL to apply changes
+    $SERVICE_MANAGER restart postgresql
+
+    print_info "User $DB_USER password: $DB_PASS"
+
+    return 0
+}
+
+# Configure database based on selected type
+setup_database() {
+    print_step "Setting up local database"
+
+    # Определяем пути к SQL-файлам в зависимости от типа БД и языка
+    if [[ "$DB_TYPE" == "postgresql" ]]; then
+        if [[ "$EYE_LANG" == "russian" && -d "/opt/Eye/docs/databases/postgres/ru" ]]; then
+            SQL_CREATE_FILE="/opt/Eye/docs/databases/postgres/ru/create_db.sql"
+        else
+            SQL_CREATE_FILE="/opt/Eye/docs/databases/postgres/en/create_db.sql"
+        fi
+    else
+        print_error "Unsupported database type: $DB_TYPE"
+        return 1
+    fi
+
+    # Проверка существования файлов
+    if [[ ! -f "$SQL_CREATE_FILE" ]]; then
+        print_error "SQL files not found for DB_TYPE=$DB_TYPE and EYE_LANG=$EYE_LANG"
+        return 1
+    fi
+    print_info "Using SQL files for $EYE_LANG language"
+    setup_postgresql
+}
+
+# Install function
+eye_migrate2pgsql() {
+    clear
+    echo -e "${GREEN}================++++++++===========================${NC}"
+    echo -e "${GREEN}   Migration Eye Monitoring System to PostgreSQL   ${NC}"
+    echo -e "${GREEN}           for ALT Linux/Debian/Ubuntu             ${NC}"
+    echo -e "${GREEN}===================================================${NC}"
+    echo ""
+
+    # Обязательные шаги (всегда)
+    check_root
+    detect_distro
+    select_language
+
+    # Обновление системы и установка пакетов (зависит от типа установки и ОС)
+    update_system
+    install_packages
+
+    # Настройка БД
+    configure_database_connection
+    setup_database
+    
+    #data migration
+    /opt/Eye/scripts/docs/databases/migrate2psql.pl
+    
+    if [ $? -eq 0 ]; then
+	setup_configs
+	fi
+}
+
+# Function to display help
+show_help() {
+    echo "Usage: $0 [options]"
+    echo ""
+    echo "Options:"
+    echo "  --help, -h     Show this help"
+    echo ""
+    echo "Supported distributions:"
+    echo "  - ALT Linux 11.1+"
+    echo "  - Debian 11+"
+    echo "  - Ubuntu 20.04+"
+    echo ""
+}
+
+# Function to check directory existence
+check_directory() {
+    [ -d "/opt/Eye" ]
+    return $?
+}
+
+# Configure configuration files
+setup_configs() {
+    print_step "Configuring configuration files"
+
+    # === Настройка веб-конфигурации (только если нужен веб) ===
+    if [[ -f "/opt/Eye/html/cfg/config.php" ]]; then
+            cp /opt/Eye/html/cfg/config.php /opt/Eye/html/cfg/config.migration.php
+            PHP_DB_TYPE="pgsql"
+            # Подстановка реальных значений
+            sed -i "s/define(\"DB_TYPE\",\"[^\"]*\");/define(\"DB_TYPE\",\"$PHP_DB_TYPE\");/" /opt/Eye/html/cfg/config.php
+            sed -i "s/define(\"DB_PORT\",\"[^\"]*\");/define(\"DB_PORT\",\"$DB_PORT\");/" /opt/Eye/html/cfg/config.php
+            print_info "Web configuration file config.php created"
+        else
+            print_warn "Web config template not found, skipping PHP config"
+        fi
+        
+    # === Настройка конфигурации бэкенда (только если нужен бэкенд) ===
+    if [[ -f "/opt/Eye/scripts/cfg/config.sample" ]]; then
+            cp /opt/Eye/scripts/cfg/config /opt/Eye/scripts/cfg/config.migration
+            # Подстановка значений
+            sed -i "s/^DBTYPE=.*/DBTYPE=$DB_TYPE/" /opt/Eye/scripts/cfg/config
+            sed -i "s/DBTYPE=mysql/DBTYPE=$DB_TYPE/" /opt/Eye/scripts/cfg/config
+            sed -i "s/^DBPORT=.*/DBPORT=$DB_PORT/" /opt/Eye/scripts/cfg/config
+            print_info "Backend configuration file scripts/cfg/config created"
+        else
+            print_warn "Backend config template not found, skipping scripts config"
+        fi
+}
+
+
+# Инициализация глобальных переменных
+DB_NAME=""
+DB_USER=""
+DB_HOST=""
+DB_PASS=""
+DB_TYPE="mysql"
+EYE_LANG="russian"
+SQL_CREATE_FILE=""
+
+PHP_CONFIG="/opt/Eye/html/cfg/config.php"
+PERL_CONFIG="/opt/Eye/scripts/cfg/config"
+
+# Проверяем наличие хотя бы одного конфига Eye
+if [[ -f "${PHP_CONFIG}" ]] || [[ -f "${PERL_CONFIG}" ]]; then
+        echo "✓ Eye configuration detected"
+    else
+	echo "Eye installation not found! Bye."
+	exit 101
+    fi
+
+if [[ -f "${PHP_CONFIG}" ]]; then
+            # Извлекаем DB_HOST из PHP-конфига
+            DB_HOST=$(grep -oP 'define\s*\(\s*"DB_HOST"\s*,\s*"\K[^"]+' ${PHP_CONFIG} 2>/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 [[ "$DB_TYPE" == "postgresql" ]]; then
+    echo "Already using PostgreSQL! Nothing to do."
+    exit 0
+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
+
+# === Вывод результатов (для отладки или использования в других скриптах) ===
+echo "EYE_LANG=$EYE_LANG"
+echo "DB_NAME=$DB_NAME"
+echo "DB_USER=$DB_USER"
+echo "DB_HOST=$DB_HOST"
+
+# Убедимся, что все необходимые параметры получены
+if [[ -z "$DB_NAME" || -z "$DB_USER" || -z "$DB_PASS" ]]; then
+    print_error "Failed to extract database credentials from config files"
+    exit 1
+fi
+
+eye_migrate2pgsql
+
+# Exit with success code
+exit 0