migrate2psql.sh 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. #!/bin/bash
  2. # Eye Migration Script for ALT Linux/Debian/Ubuntu with PostgreSQL support
  3. # Version: 2.1
  4. # set -e
  5. # Colors for output
  6. RED='\033[0;31m'
  7. GREEN='\033[0;32m'
  8. YELLOW='\033[1;33m'
  9. BLUE='\033[0;34m'
  10. NC='\033[0m' # No Color
  11. # Output functions
  12. print_info() {
  13. echo -e "${GREEN}[INFO]${NC} $1"
  14. }
  15. print_warn() {
  16. echo -e "${YELLOW}[WARN]${NC} $1"
  17. }
  18. print_error() {
  19. echo -e "${RED}[ERROR]${NC} $1"
  20. }
  21. print_step() {
  22. echo -e "${BLUE}=== $1 ===${NC}"
  23. }
  24. # Check for root privileges
  25. check_root() {
  26. if [[ $EUID -ne 0 ]]; then
  27. print_error "This script must be run as root"
  28. print_error "Use: sudo $0"
  29. exit 1
  30. fi
  31. }
  32. # Detect distribution and package manager
  33. detect_distro() {
  34. if [[ -f /etc/os-release ]]; then
  35. . /etc/os-release
  36. OS_ID=$ID
  37. OS_VERSION=$VERSION_ID
  38. OS_NAME=$NAME
  39. case $OS_ID in
  40. altlinux)
  41. PACKAGE_MANAGER="apt-get"
  42. SERVICE_MANAGER="systemctl"
  43. OS_FAMILY="alt"
  44. print_info "Detected ALT Linux $OS_VERSION"
  45. ;;
  46. debian)
  47. PACKAGE_MANAGER="apt"
  48. SERVICE_MANAGER="systemctl"
  49. OS_FAMILY="debian"
  50. print_info "Detected Debian $OS_VERSION"
  51. ;;
  52. ubuntu)
  53. PACKAGE_MANAGER="apt"
  54. SERVICE_MANAGER="systemctl"
  55. OS_FAMILY="debian"
  56. print_info "Detected Ubuntu $OS_VERSION"
  57. ;;
  58. *)
  59. print_error "Unsupported distribution: $OS_ID"
  60. print_error "Supported: ALT Linux, Debian, Ubuntu"
  61. exit 1
  62. ;;
  63. esac
  64. else
  65. print_error "Failed to detect distribution"
  66. exit 1
  67. fi
  68. }
  69. select_language() {
  70. print_step "Select Installation Language"
  71. if [ -n "${EYE_LANG}" ]; then
  72. return
  73. fi
  74. echo "Available languages:"
  75. echo "1) English"
  76. echo "2) Russian (default)"
  77. echo ""
  78. while true; do
  79. read -p "Select language (1 or 2) [2]: " lang_choice
  80. # Если пустой ввод - по умолчанию английский
  81. if [[ -z "$lang_choice" ]]; then
  82. lang_choice="2"
  83. fi
  84. # Обработка ввода (приводим к нижнему регистру)
  85. lang_choice_lower=$(echo "$lang_choice" | tr '[:upper:]' '[:lower:]')
  86. case $lang_choice_lower in
  87. 1|english|en|eng|анг|английский)
  88. EYE_LANG="english"
  89. EYE_LANG_SHORT="en"
  90. print_info "Selected English language"
  91. break
  92. ;;
  93. 2|russian|ru|rus|ру|русский)
  94. EYE_LANG="russian"
  95. EYE_LANG_SHORT="ru"
  96. print_info "Selected Russian language (Русский)"
  97. break
  98. ;;
  99. *)
  100. print_error "Invalid choice: '$lang_choice'"
  101. print_warn "Available options: 1 (English), 2 (Russian)"
  102. print_warn "You can also type: english, en, russian, ru"
  103. ;;
  104. esac
  105. done
  106. }
  107. # Настройка параметров подключения к БД (общая для local и remote)
  108. configure_database_connection() {
  109. echo ""
  110. echo "Local Database Configuration"
  111. echo "============================"
  112. DB_HOST="127.0.0.1"
  113. DB_PORT="5432"
  114. echo "Database server: $DB_HOST:$DB_PORT (local)"
  115. }
  116. # Install dependencies for ALT Linux
  117. install_deps_altlinux() {
  118. print_step "Installing dependencies for ALT Linux"
  119. apt-get update
  120. # === Локальная база данных
  121. apt-get install -y postgresql17 postgresql17-server postgresql17-contrib postgresql17-perl
  122. }
  123. # Install dependencies for Debian/Ubuntu
  124. install_deps_debian() {
  125. print_step "Installing dependencies for Debian/Ubuntu"
  126. apt-get update
  127. # === Локальная база данных
  128. apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
  129. }
  130. # System update
  131. update_system() {
  132. print_step "Updating apt cache"
  133. $PACKAGE_MANAGER update -y
  134. }
  135. upgrade_system() {
  136. print_step "Updating system"
  137. if [[ "$PACKAGE_MANAGER" == "apt-get" ]]; then
  138. apt-get dist-upgrade -y
  139. else
  140. $PACKAGE_MANAGER upgrade -y
  141. fi
  142. }
  143. # Install packages
  144. install_packages() {
  145. print_step "Installing packages"
  146. case $OS_FAMILY in
  147. alt)
  148. install_deps_altlinux
  149. ;;
  150. debian)
  151. install_deps_debian
  152. ;;
  153. esac
  154. }
  155. # Configure PostgreSQL
  156. setup_postgresql() {
  157. print_step "Configuring PostgreSQL"
  158. PGDATA="/var/lib/pgsql/data"
  159. # Для ALT Linux
  160. if [[ "$OS_FAMILY" == "alt" ]]; then
  161. echo "root ALL=(ALL:ALL) NOPASSWD: ALL" >/etc/sudoers.d/root
  162. PGDATA="/var/lib/pgsql/data"
  163. if [ -z "$(ls -A $PGDATA 2>/dev/null)" ]; then
  164. /etc/init.d/postgresql initdb
  165. # === ВАЖНО: настраиваем pg_hba.conf для безпарольного доступа ===
  166. local pg_hba_file="$PGDATA/pg_hba.conf"
  167. if [[ -f "$pg_hba_file" ]]; then
  168. # Делаем резервную копию
  169. cp "$pg_hba_file" "${pg_hba_file}.backup"
  170. # Вставляем правило для пользователя 'postgres' в начало файла
  171. # Это разрешит подключение без пароля через Unix-сокет
  172. sed -i '1i\
  173. # Allow local postgres user without password\
  174. local all postgres peer\
  175. ' "$pg_hba_file"
  176. print_info "Configured pg_hba.conf to allow peer authentication for 'postgres'"
  177. fi
  178. fi
  179. # Start and enable service
  180. $SERVICE_MANAGER enable postgresql
  181. $SERVICE_MANAGER restart postgresql
  182. else
  183. # Start and enable service
  184. $SERVICE_MANAGER enable postgresql
  185. $SERVICE_MANAGER start postgresql
  186. fi
  187. # Check PostgreSQL access
  188. if ! command -v psql &> /dev/null; then
  189. print_error "PostgreSQL client not installed"
  190. return 1
  191. fi
  192. # Определяем локаль на основе языка
  193. if [[ "$EYE_LANG" == "russian" ]]; then
  194. LC_TYPE="ru_RU.UTF-8"
  195. else
  196. LC_TYPE="en_US.UTF-8"
  197. fi
  198. print_info "Creating database '$DB_NAME' with locale '$LC_TYPE'..."
  199. # Set password for stat user
  200. print_info "Setting password for user $DB_USER ..."
  201. sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
  202. sudo -u postgres createdb \
  203. --encoding=UTF8 \
  204. --lc-collate="$LC_TYPE" \
  205. --lc-ctype="$LC_TYPE" \
  206. --template=template0 \
  207. --owner="$DB_USER" \
  208. "$DB_NAME"
  209. if [[ $? -ne 0 ]]; then
  210. print_error "Failed to create database"
  211. return 1
  212. fi
  213. print_info "Database created successfully with owner '$DB_USER'"
  214. sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
  215. # Теперь подключаемся как новый владелец для импорта
  216. print_info "Importing database structure as '$DB_USER'..."
  217. # Вариант 1: Используя sudo и переключение пользователя в psql
  218. sudo -u postgres psql -d "$DB_NAME" <<EOF
  219. SET ROLE "$DB_USER";
  220. \i $SQL_CREATE_FILE
  221. EOF
  222. if [[ $? -ne 0 ]]; then
  223. print_error "Error importing create_db.sql"
  224. return 1
  225. fi
  226. print_info "Database structure imported successfully"
  227. # Дополнительные привилегии
  228. print_info "Setting up additional privileges..."
  229. # Дать доступ пользователю postgres к БД
  230. sudo -u postgres psql -c "GRANT CONNECT ON DATABASE $DB_NAME TO postgres;"
  231. # Дать полные права пользователю postgres на все объекты
  232. sudo -u postgres psql -d "$DB_NAME" <<EOF
  233. GRANT ALL ON SCHEMA public TO postgres;
  234. ALTER DEFAULT PRIVILEGES FOR USER "$DB_USER" IN SCHEMA public GRANT ALL ON TABLES TO postgres;
  235. ALTER DEFAULT PRIVILEGES FOR USER "$DB_USER" IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres;
  236. ALTER DEFAULT PRIVILEGES FOR USER "$DB_USER" IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres;
  237. EOF
  238. print_info "Database setup completed successfully"
  239. # Configure PostgreSQL for MD5 authentication
  240. if [[ "$OS_FAMILY" == "alt" ]]; then
  241. local pg_hba_file="/var/lib/pgsql/data/pg_hba.conf"
  242. if [[ -f "$pg_hba_file" ]]; then
  243. # Backup original
  244. cp "$pg_hba_file" "${pg_hba_file}.backup"
  245. # Add local md5 authentication if not present
  246. if ! grep -q "local.*$DB_NAME.*md5" "$pg_hba_file"; then
  247. echo "local $DB_NAME $DB_USER scram-sha-256" >> "$pg_hba_file"
  248. print_info "Added MD5 authentication for $DB_USER user in pg_hba.conf"
  249. fi
  250. fi
  251. else
  252. local pg_hba_file="/etc/postgresql/$(ls /etc/postgresql/ | head -1)/main/pg_hba.conf"
  253. if [[ -f "$pg_hba_file" ]]; then
  254. # Backup original
  255. cp "$pg_hba_file" "${pg_hba_file}.backup"
  256. # Add local md5 authentication if not present
  257. if ! grep -q "local.*$DB_NAME.*md5" "$pg_hba_file"; then
  258. echo "local $DB_NAME $DB_USER scram-sha-256" >> "$pg_hba_file"
  259. print_info "Added MD5 authentication for $DB_USER user in pg_hba.conf"
  260. fi
  261. fi
  262. fi
  263. # Restart PostgreSQL to apply changes
  264. $SERVICE_MANAGER restart postgresql
  265. print_info "User $DB_USER password: $DB_PASS"
  266. return 0
  267. }
  268. # Configure database based on selected type
  269. setup_database() {
  270. print_step "Setting up local database"
  271. # Определяем пути к SQL-файлам в зависимости от типа БД и языка
  272. if [[ "$DB_TYPE" == "postgresql" ]]; then
  273. if [[ "$EYE_LANG" == "russian" && -d "/opt/Eye/docs/databases/postgres/ru" ]]; then
  274. SQL_CREATE_FILE="/opt/Eye/docs/databases/postgres/ru/create_db.sql"
  275. else
  276. SQL_CREATE_FILE="/opt/Eye/docs/databases/postgres/en/create_db.sql"
  277. fi
  278. else
  279. print_error "Unsupported database type: $DB_TYPE"
  280. return 1
  281. fi
  282. # Проверка существования файлов
  283. if [[ ! -f "$SQL_CREATE_FILE" ]]; then
  284. print_error "SQL files not found for DB_TYPE=$DB_TYPE and EYE_LANG=$EYE_LANG"
  285. return 1
  286. fi
  287. print_info "Using SQL files for $EYE_LANG language"
  288. setup_postgresql
  289. }
  290. # Install function
  291. eye_migrate2pgsql() {
  292. clear
  293. echo -e "${GREEN}================++++++++===========================${NC}"
  294. echo -e "${GREEN} Migration Eye Monitoring System to PostgreSQL ${NC}"
  295. echo -e "${GREEN} for ALT Linux/Debian/Ubuntu ${NC}"
  296. echo -e "${GREEN}===================================================${NC}"
  297. echo ""
  298. # Обязательные шаги (всегда)
  299. check_root
  300. detect_distro
  301. select_language
  302. # Обновление системы и установка пакетов (зависит от типа установки и ОС)
  303. update_system
  304. install_packages
  305. # Настройка БД
  306. configure_database_connection
  307. setup_database
  308. #data migration
  309. /opt/Eye/scripts/docs/databases/migrate2psql.pl
  310. if [ $? -eq 0 ]; then
  311. setup_configs
  312. fi
  313. }
  314. # Function to display help
  315. show_help() {
  316. echo "Usage: $0 [options]"
  317. echo ""
  318. echo "Options:"
  319. echo " --help, -h Show this help"
  320. echo ""
  321. echo "Supported distributions:"
  322. echo " - ALT Linux 11.1+"
  323. echo " - Debian 11+"
  324. echo " - Ubuntu 20.04+"
  325. echo ""
  326. }
  327. # Function to check directory existence
  328. check_directory() {
  329. [ -d "/opt/Eye" ]
  330. return $?
  331. }
  332. # Configure configuration files
  333. setup_configs() {
  334. print_step "Configuring configuration files"
  335. # === Настройка веб-конфигурации (только если нужен веб) ===
  336. if [[ -f "/opt/Eye/html/cfg/config.php" ]]; then
  337. cp /opt/Eye/html/cfg/config.php /opt/Eye/html/cfg/config.migration.php
  338. PHP_DB_TYPE="pgsql"
  339. # Подстановка реальных значений
  340. sed -i "s/define(\"DB_TYPE\",\"[^\"]*\");/define(\"DB_TYPE\",\"$PHP_DB_TYPE\");/" /opt/Eye/html/cfg/config.php
  341. sed -i "s/define(\"DB_PORT\",\"[^\"]*\");/define(\"DB_PORT\",\"$DB_PORT\");/" /opt/Eye/html/cfg/config.php
  342. print_info "Web configuration file config.php created"
  343. else
  344. print_warn "Web config template not found, skipping PHP config"
  345. fi
  346. # === Настройка конфигурации бэкенда (только если нужен бэкенд) ===
  347. if [[ -f "/opt/Eye/scripts/cfg/config.sample" ]]; then
  348. cp /opt/Eye/scripts/cfg/config /opt/Eye/scripts/cfg/config.migration
  349. # Подстановка значений
  350. sed -i "s/^DBTYPE=.*/DBTYPE=$DB_TYPE/" /opt/Eye/scripts/cfg/config
  351. sed -i "s/DBTYPE=mysql/DBTYPE=$DB_TYPE/" /opt/Eye/scripts/cfg/config
  352. sed -i "s/^DBPORT=.*/DBPORT=$DB_PORT/" /opt/Eye/scripts/cfg/config
  353. print_info "Backend configuration file scripts/cfg/config created"
  354. else
  355. print_warn "Backend config template not found, skipping scripts config"
  356. fi
  357. }
  358. # Инициализация глобальных переменных
  359. DB_NAME=""
  360. DB_USER=""
  361. DB_HOST=""
  362. DB_PASS=""
  363. DB_TYPE="mysql"
  364. EYE_LANG="russian"
  365. SQL_CREATE_FILE=""
  366. PHP_CONFIG="/opt/Eye/html/cfg/config.php"
  367. PERL_CONFIG="/opt/Eye/scripts/cfg/config"
  368. # Проверяем наличие хотя бы одного конфига Eye
  369. if [[ -f "${PHP_CONFIG}" ]] || [[ -f "${PERL_CONFIG}" ]]; then
  370. echo "✓ Eye configuration detected"
  371. else
  372. echo "Eye installation not found! Bye."
  373. exit 101
  374. fi
  375. if [[ -f "${PHP_CONFIG}" ]]; then
  376. # Извлекаем DB_HOST из PHP-конфига
  377. DB_HOST=$(grep -oP 'define\s*\(\s*"DB_HOST"\s*,\s*"\K[^"]+' ${PHP_CONFIG} 2>/dev/null)
  378. fi
  379. if [[ -z "$DB_HOST" && -f "${PERL_CONFIG}" ]]; then
  380. # Извлекаем из Perl-конфига
  381. DB_HOST=$(grep -oP '^DBHOST=\K.*' ${PERL_CONFIG} 2>/dev/null)
  382. fi
  383. if [[ "$DB_HOST" == "127.0.0.1" || "$DB_HOST" == "localhost" || "$DB_HOST" == "::1" ]]; then
  384. DB_INSTALL="local"
  385. else
  386. echo "Remote database detected. Abort installation!"
  387. exit 100
  388. fi
  389. # === Восстанавливаем DB_TYPE ===
  390. if [[ -f "${PHP_CONFIG}" ]]; then
  391. DB_TYPE=$(grep -oP 'define\s*\(\s*"DB_TYPE"\s*,\s*"\K[^"]+' ${PHP_CONFIG} 2>/dev/null)
  392. # В PHP может быть 'pgsql' вместо 'postgresql'
  393. if [[ "$DB_TYPE" == "pgsql" ]]; then
  394. DB_TYPE="postgresql"
  395. elif [[ "$DB_TYPE" == "mysql" ]]; then
  396. DB_TYPE="mysql"
  397. fi
  398. elif [[ -f "${PERL_CONFIG}" ]]; then
  399. DB_TYPE=$(grep -oP '^DBTYPE=\K.*' ${PERL_CONFIG} 2>/dev/null)
  400. fi
  401. if [[ "$DB_TYPE" == "postgresql" ]]; then
  402. echo "Already using PostgreSQL! Nothing to do."
  403. exit 0
  404. fi
  405. if [[ -f "$PHP_CONFIG" ]]; then
  406. # Извлекаем язык
  407. if HTML_LANG=$(grep -oP 'define\s*\(\s*"HTML_LANG"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null); then
  408. case "$HTML_LANG" in
  409. russian|ru) EYE_LANG="russian" ;;
  410. english|en) EYE_LANG="english" ;;
  411. esac
  412. fi
  413. # Извлекаем БД параметры
  414. DB_NAME=$(grep -oP 'define\s*\(\s*"DB_NAME"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null)
  415. DB_USER=$(grep -oP 'define\s*\(\s*"DB_USER"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null)
  416. DB_HOST=$(grep -oP 'define\s*\(\s*"DB_HOST"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null)
  417. DB_PASS=$(grep -oP 'define\s*\(\s*"DB_PASS"\s*,\s*"\K[^"]+' "$PHP_CONFIG" 2>/dev/null)
  418. fi
  419. # читаем из Perl-конфига ===
  420. if [[ -z "$DB_NAME" || -z "$DB_USER" || -z "$DB_PASS" ]] && [[ -f "$PERL_CONFIG" ]]; then
  421. while IFS='=' read -r key value; do
  422. # Пропускаем комментарии и пустые строки
  423. [[ $key =~ ^#.*$ || -z $key ]] && continue
  424. case "$key" in
  425. DBNAME) DB_NAME="$value" ;;
  426. DBUSER) DB_USER="$value" ;;
  427. DBSERVER) DB_HOST="$value" ;;
  428. DBPASS) DB_PASS="$value" ;;
  429. esac
  430. done < "$PERL_CONFIG"
  431. fi
  432. # === Вывод результатов (для отладки или использования в других скриптах) ===
  433. echo "EYE_LANG=$EYE_LANG"
  434. echo "DB_NAME=$DB_NAME"
  435. echo "DB_USER=$DB_USER"
  436. echo "DB_HOST=$DB_HOST"
  437. # Убедимся, что все необходимые параметры получены
  438. if [[ -z "$DB_NAME" || -z "$DB_USER" || -z "$DB_PASS" ]]; then
  439. print_error "Failed to extract database credentials from config files"
  440. exit 1
  441. fi
  442. eye_migrate2pgsql
  443. # Exit with success code
  444. exit 0