Переглянути джерело

fixed mistake in mysql schema

root 3 місяців тому
батько
коміт
96c99ab270

+ 197 - 0
docs/databases/checkDBschema.pl

@@ -0,0 +1,197 @@
+#!/usr/bin/perl
+
+#
+# Copyright (C) Roman Dmitriev, rnd@rajven.ru
+#
+
+use utf8;
+use open ":encoding(utf8)";
+use open ':std', ':encoding(UTF-8)';
+use Encode;
+no warnings 'utf8';
+use English;
+use FindBin '$Bin';
+use lib "/opt/Eye/scripts";
+use Getopt::Long qw(GetOptions);
+use Data::Dumper;
+use eyelib::config;
+use eyelib::main;
+use eyelib::database;
+use eyelib::common;
+use eyelib::net_utils;
+use strict;
+use warnings;
+
+# === Получаем имя чистой БД ===
+my $clear_db_name = $DBNAME . "_test";
+
+# === Подключаемся к рабочей БД ===
+my $work_db = init_db();
+
+# === Подключаемся к чистой БД ===
+my $clear_db;
+if ($config_ref{DBTYPE} eq 'mysql') {
+    my $dsn = "dbi:mysql:database=$clear_db_name;host=$DBHOST;port=3306;mysql_local_infile=1";
+    $clear_db = DBI->connect($dsn, $DBUSER, $DBPASS, {
+        RaiseError => 0,
+        AutoCommit => 1,
+        mysql_enable_utf8 => 1
+    });
+    if (!defined $clear_db) {
+        die "Cannot connect to MySQL database '$clear_db_name': $DBI::errstr\n";
+    }
+    $clear_db->do('SET NAMES utf8mb4');
+} else {
+    my $dsn = "dbi:Pg:dbname=$clear_db_name;host=$DBHOST;port=5432;";
+    $clear_db = DBI->connect($dsn, $DBUSER, $DBPASS, {
+        RaiseError => 0,
+        AutoCommit => 1,
+        pg_enable_utf8 => 1,
+        pg_server_prepare => 0
+    });
+    if (!defined $clear_db) {
+        die "Cannot connect to PostgreSQL database '$clear_db_name': $DBI::errstr\n";
+    }
+}
+
+# === Функция нормализации значения по умолчанию ===
+sub normalize_default {
+    my ($default, $db_type) = @_;
+    return undef unless defined $default;
+
+    if ($db_type eq 'mysql') {
+        # Убираем кавычки, если строка
+        $default =~ s/^'(.*)'$/$1/;
+        # NULL → undef
+        return undef if lc($default) eq 'null';
+    } else {
+        # PostgreSQL: уже в нормальном виде
+        return undef if lc($default) eq 'null';
+    }
+    return $default;
+}
+
+# === Сбор схемы для БД ===
+sub get_schema {
+    my ($db, $db_type, $db_name) = @_;
+    my %schema;
+
+    my @tables;
+    if ($db_type eq 'mysql') {
+        my @rows = get_records_sql($db, 'SHOW TABLES');
+        my $idx = 'Tables_in_' . $db_name;
+        @tables = map { $_->{$idx} } grep { $_ && exists $_->{$idx} } @rows;
+    } else {
+        my @rows = get_records_sql($db, "SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
+        @tables = map { $_->{tablename} } @rows;
+    }
+
+    for my $table (@tables) {
+        my %cols = get_table_columns($db, $table);
+        # get_table_columns уже возвращает lowercase имена
+        for my $col (keys %cols) {
+            my $info = $cols{$col};
+            $schema{$table}{$col} = {
+                type     => $info->{type}     // '',
+                nullable => $info->{nullable} // 1,
+                default  => normalize_default($info->{default}, $db_type),
+            };
+        }
+    }
+    return %schema;
+}
+
+# === Сбор схем ===
+print "Fetching schema from working database '$DBNAME'...\n";
+my %work_schema = get_schema($work_db, $config_ref{DBTYPE}, $DBNAME);
+
+print "Fetching schema from clean database '$clear_db_name'...\n";
+my %clear_schema = get_schema($clear_db, $config_ref{DBTYPE}, $clear_db_name);
+
+print "\n=== Comparing DB schemas ===\n\n";
+
+my $has_critical_error = 0;
+
+# === 1. Проверка: всё ли из чистой БД есть в рабочей? ===
+for my $table (keys %clear_schema) {
+    if (!exists $work_schema{$table}) {
+        print "❗ ERROR: Table '$table' exists in clean DB but not in working DB!\n";
+        $has_critical_error = 1;
+        next;
+    }
+
+    for my $col (keys %{ $clear_schema{$table} }) {
+        if (!exists $work_schema{$table}{$col}) {
+            print "❗ ERROR: Column '$col' in table '$table' exists in clean DB but not in working DB!\n";
+            $has_critical_error = 1;
+            next;
+        }
+
+        # === Сравнение типов ===
+        my $clean_type = $clear_schema{$table}{$col}{type} // '';
+        my $work_type  = $work_schema{$table}{$col}{type} // '';
+
+        # Нормализуем типы для сравнения (MySQL vs PG)
+#        if ($config_ref{DBTYPE} eq 'mysql') {
+            # Пример: TINYINT(1) → boolean-like, но у нас SMALLINT
+            # Для простоты сравниваем как строки
+#        }
+
+        if ($clean_type ne $work_type) {
+            print "❗ ERROR: Column '$col' in table '$table' has different type:\n";
+            print "      Clean: '$clean_type', Working: '$work_type'\n";
+            $has_critical_error = 1;
+        }
+
+        # === Сравнение NULL ===
+        my $clean_null = $clear_schema{$table}{$col}{nullable} // 1;
+        my $work_null  = $work_schema{$table}{$col}{nullable} // 1;
+
+        if ($clean_null != $work_null) {
+            my $clean_str = $clean_null ? "NULL" : "NOT NULL";
+            my $work_str  = $work_null  ? "NULL" : "NOT NULL";
+            print "❗ ERROR: Column '$col' in table '$table' has different NULL setting:\n";
+            print "      Clean: $clean_str, Working: $work_str\n";
+            $has_critical_error = 1;
+        }
+
+        # === Сравнение DEFAULT ===
+        my $clean_def = $clear_schema{$table}{$col}{default};
+        my $work_def  = $work_schema{$table}{$col}{default};
+
+        if (!defined $clean_def && !defined $work_def) {
+            # ok
+        } elsif (!defined $clean_def || !defined $work_def) {
+            print "❗ ERROR: Column '$col' in table '$table' has different DEFAULT (one is NULL):\n";
+            print "      Clean: ", defined $clean_def ? "'$clean_def'" : "NULL", "\n";
+            print "      Working: ", defined $work_def ? "'$work_def'" : "NULL", "\n";
+            $has_critical_error = 1;
+        } elsif ($clean_def ne $work_def) {
+            print "❗ ERROR: Column '$col' in table '$table' has different DEFAULT:\n";
+            print "      Clean: '$clean_def', Working: '$work_def'\n";
+            $has_critical_error = 1;
+        }
+    }
+}
+
+# === 2. Проверка: есть ли лишнее в рабочей БД? ===
+for my $table (keys %work_schema) {
+    if (!exists $clear_schema{$table}) {
+        print "⚠  WARNING: Table '$table' exists in working DB but not in clean DB — will be skipped.\n";
+        next;
+    }
+
+    for my $col (keys %{ $work_schema{$table} }) {
+        if (!exists $clear_schema{$table}{$col}) {
+            print "⚠  WARNING: Column '$col' in table '$table' exists in working DB but not in clean DB — will be ignored.\n";
+        }
+    }
+}
+
+if ($has_critical_error) {
+    print "\nSchema validation failed: structural differences found.\n";
+    exit 103;
+}
+
+print "✅ Schema validation passed.\n\n";
+exit 0;

+ 474 - 0
docs/databases/checkDBschema.sh

@@ -0,0 +1,474 @@
+#!/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 "============================"
+    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
+
+    print_info "Importing database structure..."
+
+    # Import main SQL file
+    mysql $MYSQL_OPT <<EOF
+CREATE DATABASE IF NOT EXISTS ${DB_TEST} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+EOF
+    mysql $MYSQL_OPT ${DB_TEST} < ${SQL_CREATE_FILE}
+
+    if [[ $? -ne 0 ]]; then
+        print_error "Error importing create_db.sql"
+        if [[ -f "$MYSQL_CNF_FILE" ]]; then
+            rm -f "$MYSQL_CNF_FILE"
+        fi
+        return 1
+    fi
+
+    print_info "Database structure imported"
+
+    # Create db user
+    print_info "Creating user ${DB_USER}.."
+    mysql $MYSQL_OPT <<EOF
+GRANT ALL PRIVILEGES ON $DB_TEST.* TO '$DB_USER'@'localhost';
+FLUSH PRIVILEGES;
+EOF
+
+    if [[ $? -ne 0 ]]; then
+        print_error "Error update user $DB_USER"
+        if [[ -f "$MYSQL_CNF_FILE" ]]; then
+            rm -f "$MYSQL_CNF_FILE"
+        fi
+        return 1
+    fi
+
+    # Clean up temporary file if created
+    if [[ -f "$MYSQL_CNF_FILE" ]]; then
+        rm -f "$MYSQL_CNF_FILE"
+    fi
+
+    return 0
+}
+
+# Configure PostgreSQL
+setup_postgresql() {
+    print_step "Configuring PostgreSQL"
+
+    # Определяем локаль на основе языка
+    if [[ "$EYE_LANG" == "russian" ]]; then
+        LC_TYPE="ru_RU.UTF-8"
+    else
+        LC_TYPE="en_US.UTF-8"
+    fi
+
+    print_info "Creating database '$DB_TEST' with locale '$LC_TYPE'..."
+
+    sudo -u postgres createdb \
+      --encoding=UTF8 \
+      --lc-collate="$LC_TYPE" \
+      --lc-ctype="$LC_TYPE" \
+      --template=template0 \
+      --owner="$DB_USER" \
+      "$DB_TEST"
+
+    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_TEST TO $DB_USER;"
+
+    # Теперь подключаемся как новый владелец для импорта
+    print_info "Importing database structure as '$DB_USER'..."
+
+    # Вариант 1: Используя sudo и переключение пользователя в psql
+    sudo -u postgres psql -d "$DB_TEST" <<EOF
+SET ROLE "$DB_USER";
+\i $SQL_CREATE_FILE
+EOF
+
+    if [[ $? -ne 0 ]]; then
+        print_error "Error importing create_db.sql"
+        exit 102
+    fi
+
+    print_info "Database structure imported successfully"
+
+    # Дополнительные привилегии 
+    print_info "Setting up additional privileges..."
+
+    # Дать доступ пользователю postgres к БД
+    sudo -u postgres psql -c "GRANT CONNECT ON DATABASE $DB_TEST TO postgres;"
+
+    # Дать полные права пользователю postgres на все объекты
+    sudo -u postgres psql -d "$DB_TEST" <<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"
+
+    return 0
+}
+
+# Configure database based on selected type
+setup_database() {
+    # Пропускаем настройку, если БД — удалённая
+    if [[ "$DB_INSTALL" != "local" ]]; then
+        print_info "Database is configured remotely — skipping local setup"
+        return 0
+    fi
+
+    print_step "Setting up local database"
+
+    # Определяем пути к SQL-файлам в зависимости от типа БД и языка
+    if [[ "$DB_TYPE" == "mysql" ]]; then
+        if [[ "$EYE_LANG" == "russian" && -d "/opt/Eye/docs/databases/mysql/ru" ]]; then
+            SQL_CREATE_FILE="/opt/Eye/docs/databases/mysql/ru/create_db.sql"
+        else
+            SQL_CREATE_FILE="/opt/Eye/docs/databases/mysql/en/create_db.sql"
+        fi
+    elif [[ "$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"
+
+    # Выполняем настройку в зависимости от СУБД
+    if [[ "$DB_TYPE" == "postgresql" ]]; then
+        setup_postgresql
+    else
+        setup_mysql
+    fi
+}
+
+# Install function
+install_clear_db() {
+    clear
+    echo -e "${GREEN}================++++++++===========================${NC}"
+    echo -e "${GREEN}   CheckDB Schema for Eye Monitoring System        ${NC}"
+    echo -e "${GREEN}           for ALT Linux/Debian/Ubuntu             ${NC}"
+    echo -e "${GREEN}===================================================${NC}"
+    echo ""
+
+    # Обязательные шаги (всегда)
+    check_root
+    detect_distro
+    select_language
+
+    # Настройка БД
+    configure_database_connection
+    setup_database
+
+    #data migration
+    /opt/Eye/docs/databases/checkDBschema.pl
+
+    echo "The $DB_TEST database can be deleted"
+}
+
+# Function to display help
+show_help() {
+    echo "Usage: $0"
+    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 $?
+}
+
+# Инициализация глобальных переменных
+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 [[ -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

+ 17 - 17
docs/databases/mysql/en/create_db.sql

@@ -16,7 +16,7 @@ CREATE TABLE `acl` (
 CREATE TABLE `ad_comp_cache` (
   `id` int(11) NOT NULL,
   `name` varchar(63) NOT NULL,
-  `last_found` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
+  `last_found` DATETIME NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `auth_rules` (
@@ -109,7 +109,7 @@ CREATE TABLE `devices` (
   `user_id` int(11) DEFAULT NULL,
   `deleted` tinyint(1) NOT NULL DEFAULT 0,
   `discovery_locked` tinyint(1) NOT NULL DEFAULT 0,
-  `locked_timestamp` timestamp NULL DEFAULT current_timestamp()
+  `locked_timestamp` DATETIME NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `device_filter_instances` (
@@ -167,7 +167,7 @@ CREATE TABLE `dhcp_log` (
   `ip_int` bigint(20) UNSIGNED NOT NULL,
   `ip` varchar(15) DEFAULT NULL,
   `action` varchar(10) NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `auth_id` bigint(20) UNSIGNED NOT NULL,
   `dhcp_hostname` varchar(250) DEFAULT NULL,
   `circuit_id` varchar(255) DEFAULT NULL,
@@ -180,7 +180,7 @@ CREATE TABLE `dhcp_queue` (
   `mac` varchar(17) NOT NULL,
   `ip` varchar(15) DEFAULT NULL,
   `action` varchar(10) NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `dhcp_hostname` varchar(250) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci KEY_BLOCK_SIZE=8 ROW_FORMAT=COMPRESSED;
 
@@ -188,7 +188,7 @@ CREATE TABLE `dns_cache` (
   `id` bigint(20) UNSIGNED NOT NULL,
   `dns` varchar(250) DEFAULT NULL,
   `ip` bigint(20) UNSIGNED DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp()
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `dns_queue` (
@@ -227,7 +227,7 @@ CREATE TABLE `group_filters` (
   `id` int(11) NOT NULL,
   `group_id` int(11) NOT NULL DEFAULT 0,
   `filter_id` int(11) NOT NULL DEFAULT 0,
-  `order` int(11) NOT NULL DEFAULT 0,
+  `rule_order` int(11) NOT NULL DEFAULT 0,
   `action` tinyint(1) NOT NULL DEFAULT 0
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
@@ -241,7 +241,7 @@ CREATE TABLE `group_list` (
 CREATE TABLE `mac_history` (
   `id` bigint(20) UNSIGNED NOT NULL,
   `mac` varchar(12) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `device_id` bigint(20) UNSIGNED DEFAULT NULL,
   `port_id` bigint(20) UNSIGNED DEFAULT NULL,
   `ip` varchar(15) DEFAULT NULL,
@@ -283,7 +283,7 @@ CREATE TABLE `queue_list` (
 
 CREATE TABLE `remote_syslog` (
   `id` bigint(20) UNSIGNED NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `device_id` bigint(20) UNSIGNED NOT NULL,
   `ip` varchar(15) DEFAULT NULL,
   `message` text NOT NULL
@@ -321,7 +321,7 @@ CREATE TABLE `traffic_detail` (
   `id` bigint(20) UNSIGNED NOT NULL,
   `auth_id` bigint(20) UNSIGNED DEFAULT NULL,
   `router_id` int(11) NOT NULL DEFAULT 0,
-  `ts` timestamp NULL DEFAULT NULL,
+  `ts` DATETIME NULL DEFAULT NULL,
   `proto` tinyint(3) UNSIGNED DEFAULT NULL,
   `src_ip` bigint(20) NOT NULL DEFAULT 0,
   `dst_ip` bigint(20) NOT NULL DEFAULT 0,
@@ -336,7 +336,7 @@ CREATE TABLE `unknown_mac` (
   `mac` varchar(12) DEFAULT NULL,
   `port_id` bigint(20) UNSIGNED DEFAULT NULL,
   `device_id` int(11) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `user_auth` (
@@ -371,7 +371,7 @@ CREATE TABLE `user_auth` (
   `month_quota` int(11) NOT NULL DEFAULT 0,
   `device_model_id` int(11) DEFAULT 87,
   `firmware` varchar(100) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `client_id` varchar(250) DEFAULT NULL,
   `nagios` tinyint(1) NOT NULL DEFAULT 0,
   `nagios_status` varchar(10) NOT NULL DEFAULT '',
@@ -388,12 +388,12 @@ CREATE TABLE `user_auth_alias` (
   `auth_id` int(11) NOT NULL,
   `alias` varchar(100) DEFAULT NULL,
   `description` varchar(100) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp()
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `user_list` (
   `id` bigint(20) UNSIGNED NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `login` varchar(255) DEFAULT NULL,
   `description` varchar(255) DEFAULT NULL,
   `enabled` tinyint(1) NOT NULL DEFAULT 1,
@@ -447,8 +447,8 @@ CREATE TABLE `variables` (
   `id` int(11) NOT NULL,
   `name` varchar(30) NOT NULL,
   `value` varchar(255) DEFAULT NULL,
-  `clear_time` timestamp NOT NULL DEFAULT current_timestamp(),
-  `created` timestamp NOT NULL DEFAULT current_timestamp()
+  `clear_time` DATETIME NOT NULL DEFAULT current_timestamp(),
+  `created` DATETIME NOT NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `vendors` (
@@ -474,7 +474,7 @@ CREATE TABLE `wan_stats` (
 
 CREATE TABLE `worklog` (
   `id` bigint(20) UNSIGNED NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `auth_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
   `customer` varchar(50) NOT NULL DEFAULT 'system',
   `ip` varchar(18) NOT NULL DEFAULT '127.0.0.1',
@@ -654,7 +654,7 @@ ALTER TABLE `version`
 ALTER TABLE `wan_stats`
   ADD PRIMARY KEY (`id`),
   ADD UNIQUE KEY `main` (`ts`,`router_id`,`interface_id`),
-  ADD KEY `times` (`time`);
+  ADD KEY `times` (`ts`);
 
 ALTER TABLE `worklog`
   ADD PRIMARY KEY (`id`),

+ 17 - 17
docs/databases/mysql/ru/create_db.sql

@@ -16,7 +16,7 @@ CREATE TABLE `acl` (
 CREATE TABLE `ad_comp_cache` (
   `id` int(11) NOT NULL,
   `name` varchar(63) NOT NULL,
-  `last_found` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
+  `last_found` DATETIME NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `auth_rules` (
@@ -109,7 +109,7 @@ CREATE TABLE `devices` (
   `user_id` int(11) DEFAULT NULL,
   `deleted` tinyint(1) NOT NULL DEFAULT 0,
   `discovery_locked` tinyint(1) NOT NULL DEFAULT 0,
-  `locked_timestamp` timestamp NULL DEFAULT current_timestamp()
+  `locked_timestamp` DATETIME NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `device_filter_instances` (
@@ -167,7 +167,7 @@ CREATE TABLE `dhcp_log` (
   `ip_int` bigint(20) UNSIGNED NOT NULL,
   `ip` varchar(15) DEFAULT NULL,
   `action` varchar(10) NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `auth_id` bigint(20) UNSIGNED NOT NULL,
   `dhcp_hostname` varchar(250) DEFAULT NULL,
   `circuit_id` varchar(255) DEFAULT NULL,
@@ -180,7 +180,7 @@ CREATE TABLE `dhcp_queue` (
   `mac` varchar(17) NOT NULL,
   `ip` varchar(15) DEFAULT NULL,
   `action` varchar(10) NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `dhcp_hostname` varchar(250) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci KEY_BLOCK_SIZE=8 ROW_FORMAT=COMPRESSED;
 
@@ -188,7 +188,7 @@ CREATE TABLE `dns_cache` (
   `id` bigint(20) UNSIGNED NOT NULL,
   `dns` varchar(250) DEFAULT NULL,
   `ip` bigint(20) UNSIGNED DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp()
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `dns_queue` (
@@ -227,7 +227,7 @@ CREATE TABLE `group_filters` (
   `id` int(11) NOT NULL,
   `group_id` int(11) NOT NULL DEFAULT 0,
   `filter_id` int(11) NOT NULL DEFAULT 0,
-  `order` int(11) NOT NULL DEFAULT 0,
+  `rule_order` int(11) NOT NULL DEFAULT 0,
   `action` tinyint(1) NOT NULL DEFAULT 0
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
@@ -241,7 +241,7 @@ CREATE TABLE `group_list` (
 CREATE TABLE `mac_history` (
   `id` bigint(20) UNSIGNED NOT NULL,
   `mac` varchar(12) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `device_id` bigint(20) UNSIGNED DEFAULT NULL,
   `port_id` bigint(20) UNSIGNED DEFAULT NULL,
   `ip` varchar(15) DEFAULT NULL,
@@ -283,7 +283,7 @@ CREATE TABLE `queue_list` (
 
 CREATE TABLE `remote_syslog` (
   `id` bigint(20) UNSIGNED NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `device_id` bigint(20) UNSIGNED NOT NULL,
   `ip` varchar(15) DEFAULT NULL,
   `message` text NOT NULL
@@ -321,7 +321,7 @@ CREATE TABLE `traffic_detail` (
   `id` bigint(20) UNSIGNED NOT NULL,
   `auth_id` bigint(20) UNSIGNED DEFAULT NULL,
   `router_id` int(11) NOT NULL DEFAULT 0,
-  `ts` timestamp NULL DEFAULT NULL,
+  `ts` DATETIME NULL DEFAULT NULL,
   `proto` tinyint(3) UNSIGNED DEFAULT NULL,
   `src_ip` bigint(20) NOT NULL DEFAULT 0,
   `dst_ip` bigint(20) NOT NULL DEFAULT 0,
@@ -336,7 +336,7 @@ CREATE TABLE `unknown_mac` (
   `mac` varchar(12) DEFAULT NULL,
   `port_id` bigint(20) UNSIGNED DEFAULT NULL,
   `device_id` int(11) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `user_auth` (
@@ -371,7 +371,7 @@ CREATE TABLE `user_auth` (
   `month_quota` int(11) NOT NULL DEFAULT 0,
   `device_model_id` int(11) DEFAULT 87,
   `firmware` varchar(100) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `client_id` varchar(250) DEFAULT NULL,
   `nagios` tinyint(1) NOT NULL DEFAULT 0,
   `nagios_status` varchar(10) NOT NULL DEFAULT '',
@@ -388,12 +388,12 @@ CREATE TABLE `user_auth_alias` (
   `auth_id` int(11) NOT NULL,
   `alias` varchar(100) DEFAULT NULL,
   `description` varchar(100) DEFAULT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp()
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `user_list` (
   `id` bigint(20) UNSIGNED NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `login` varchar(255) DEFAULT NULL,
   `description` varchar(255) DEFAULT NULL,
   `enabled` tinyint(1) NOT NULL DEFAULT 1,
@@ -447,8 +447,8 @@ CREATE TABLE `variables` (
   `id` int(11) NOT NULL,
   `name` varchar(30) NOT NULL,
   `value` varchar(255) DEFAULT NULL,
-  `clear_time` timestamp NOT NULL DEFAULT current_timestamp(),
-  `created` timestamp NOT NULL DEFAULT current_timestamp()
+  `clear_time` DATETIME NOT NULL DEFAULT current_timestamp(),
+  `created` DATETIME NOT NULL DEFAULT current_timestamp()
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 CREATE TABLE `vendors` (
@@ -474,7 +474,7 @@ CREATE TABLE `wan_stats` (
 
 CREATE TABLE `worklog` (
   `id` bigint(20) UNSIGNED NOT NULL,
-  `ts` timestamp NOT NULL DEFAULT current_timestamp(),
+  `ts` DATETIME NOT NULL DEFAULT current_timestamp(),
   `auth_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
   `customer` varchar(50) NOT NULL DEFAULT 'system',
   `ip` varchar(18) NOT NULL DEFAULT '127.0.0.1',
@@ -654,7 +654,7 @@ ALTER TABLE `version`
 ALTER TABLE `wan_stats`
   ADD PRIMARY KEY (`id`),
   ADD UNIQUE KEY `main` (`ts`,`router_id`,`interface_id`),
-  ADD KEY `times` (`time`);
+  ADD KEY `times` (`ts`);
 
 ALTER TABLE `worklog`
   ADD PRIMARY KEY (`id`),

+ 5 - 2
install-eye.sh

@@ -705,7 +705,7 @@ setup_mysql() {
     echo
     if [[ ! $REPLY =~ ^[Yy]$ ]]; then
         print_warn "Database creation skipped. Create manually:"
-        print_warn "  mysql -u root -p < ${SQL_CREATE_FILE}"
+        print_warn "  mysql -u root -p ${DB_NAME}< ${SQL_CREATE_FILE}"
         print_warn "  mysql -u root -p ${DB_NAME} < ${SQL_DATA_FILE}"
         if [[ -f "$MYSQL_CNF_FILE" ]]; then
             rm -f "$MYSQL_CNF_FILE"
@@ -719,7 +719,10 @@ setup_mysql() {
     print_info "Importing database structure..."
 
     # Import main SQL file
-    mysql $MYSQL_OPT < ${SQL_CREATE_FILE}
+    mysql $MYSQL_OPT <<EOF
+CREATE DATABASE IF NOT EXISTS ${DB_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+EOF
+    mysql $MYSQL_OPT ${DB_NAME} < ${SQL_CREATE_FILE}
 
     if [[ $? -ne 0 ]]; then
         print_error "Error importing create_db.sql"

+ 38 - 35
scripts/updates/3-0-1/migration.msql

@@ -22,7 +22,7 @@ ALTER TABLE user_auth CHANGE COLUMN `client-id` client_id VARCHAR(250);
 ALTER TABLE customers CHANGE COLUMN `Login` login VARCHAR(20) DEFAULT NULL;
 
 -- Переименовываем eof → end_life в user_auth
-ALTER TABLE user_auth CHANGE COLUMN `eof` end_life TIMESTAMP NULL DEFAULT NULL;
+ALTER TABLE user_auth CHANGE COLUMN `eof` end_life DATETIME NULL DEFAULT NULL;
 
 ALTER TABLE dhcp_log CHANGE COLUMN `client-id` client_id VARCHAR(250);
 ALTER TABLE dhcp_log CHANGE COLUMN `circuit-id` circuit_id VARCHAR(255);
@@ -39,36 +39,37 @@ ALTER TABLE device_types CHANGE COLUMN `name.russian` name_russian VARCHAR(50);
 ALTER TABLE device_types CHANGE COLUMN `name.english` name_english VARCHAR(50);
 
 -- timestamp → ts
-ALTER TABLE dhcp_log        CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE dhcp_queue      CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE dns_cache       CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE mac_history     CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE user_auth       CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE user_stats      CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE user_stats_full CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE worklog         CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE user_list       CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE traffic_detail  CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE unknown_mac     CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE user_auth_alias CHANGE COLUMN `timestamp` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE dhcp_log        CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE dhcp_queue      CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE dns_cache       CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE mac_history     CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE user_auth       CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE user_stats      CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE user_stats_full CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE worklog         CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE user_list       CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE traffic_detail  CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE unknown_mac     CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE user_auth_alias CHANGE COLUMN `timestamp` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
 
 -- time/date → ts
 DELETE FROM wan_stats WHERE `time` <= '1970-01-01 03:00:00' OR `time` = '0000-00-00 00:00:00';
-ALTER TABLE wan_stats     CHANGE COLUMN `time` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE remote_syslog CHANGE COLUMN `date` ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-
--- Добавляем столбец `comment` во все нужные таблицы (включая customers!)
-ALTER TABLE acl              ADD COLUMN comment VARCHAR(250);
-ALTER TABLE building         ADD COLUMN comment VARCHAR(250);
-ALTER TABLE customers        ADD COLUMN comment VARCHAR(255);
-ALTER TABLE devices          ADD COLUMN comment VARCHAR(255);
-ALTER TABLE filter_instances ADD COLUMN comment VARCHAR(200);
-ALTER TABLE filter_list      ADD COLUMN comment VARCHAR(250);
-ALTER TABLE group_list       ADD COLUMN comment VARCHAR(250);
-ALTER TABLE ou               ADD COLUMN comment VARCHAR(250);
-ALTER TABLE subnets          ADD COLUMN comment VARCHAR(250);
-ALTER TABLE vendors          ADD COLUMN comment VARCHAR(255);
-ALTER TABLE auth_rules       ADD COLUMN comment VARCHAR(255);
+ALTER TABLE wan_stats     CHANGE COLUMN `time` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+ALTER TABLE remote_syslog CHANGE COLUMN `date` ts DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
+
+-- Добавляем столбец `comment` во все нужные таблицы 
+ALTER TABLE acl              ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE building         ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE customers        ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE devices          ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE filter_instances ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE filter_list      ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE group_list       ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE ou               ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE subnets          ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE vendors          ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE auth_rules       ADD COLUMN `comment` VARCHAR(255);
+ALTER TABLE device_ports     ADD COLUMN `comment` description VARCHAR(255);
 
 -- Теперь безопасно переименовываем `comment` → `description`
 ALTER TABLE acl              CHANGE COLUMN `comment` description VARCHAR(250);
@@ -83,12 +84,11 @@ ALTER TABLE subnets          CHANGE COLUMN `comment` description VARCHAR(250);
 ALTER TABLE user_list        CHANGE COLUMN `fio` description VARCHAR(255);
 ALTER TABLE vendors          CHANGE COLUMN `comment` description VARCHAR(255);
 ALTER TABLE auth_rules       CHANGE COLUMN `comment` description VARCHAR(255);
-
--- user_auth.comments → description
-ALTER TABLE user_auth CHANGE COLUMN `comments` description VARCHAR(250);
+ALTER TABLE device_ports     CHANGE COLUMN `comment` description VARCHAR(255);
+ALTER TABLE user_auth        CHANGE COLUMN `comments` description VARCHAR(250);
 
 -- Добавляем поле mac_found в user_auth
-ALTER TABLE user_auth ADD COLUMN mac_found TIMESTAMP NULL DEFAULT NULL;
+ALTER TABLE user_auth ADD COLUMN mac_found DATETIME NULL DEFAULT NULL;
 UPDATE user_auth SET mac_found = last_found WHERE last_found IS NOT NULL;
 
 -- type → уточнённые имена
@@ -123,7 +123,7 @@ ALTER TABLE queue_list CHANGE COLUMN `Upload` `upload` INT(11) NOT NULL DEFAULT
 -- speedup worklog
 ALTER TABLE `worklog` ADD INDEX `idx_ts` (`ts`);
 
--- Исправление таблицы traffic_detail: src_ip/dst_ip → BIGINT (без UNSIGNED
+-- Исправление таблицы traffic_detail: src_ip/dst_ip → BIGINT
 ALTER TABLE `traffic_detail` MODIFY `src_ip` BIGINT NOT NULL DEFAULT 0, MODIFY `dst_ip` BIGINT NOT NULL DEFAULT 0;
 
 -- Исправление customers: убрать строковые 'NULL'
@@ -147,5 +147,8 @@ ALTER TABLE `device_ports`  CHANGE COLUMN `ifName` `ifname` VARCHAR(40) DEFAULT
 -- prepare group lieveling
 ALTER TABLE ou ADD COLUMN parent_id INT(11) DEFAULT NULL;
 
--- change comment
-ALTER TABLE device_ports CHANGE COLUMN `comment` description VARCHAR(250);
+-- change timestamp to datetime
+ALTER TABLE `ad_comp_cache`     MODIFY COLUMN `last_found` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP();
+ALTER TABLE `devices`           MODIFY COLUMN `locked_timestamp` DATETIME NULL DEFAULT CURRENT_TIMESTAMP();
+ALTER TABLE `variables`         MODIFY COLUMN `clear_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), MODIFY COLUMN `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP();
+