Инструкция: перевод подключений к БД на единое имя хоста infrascopedb

1. Цель

Во всех конфигурационных файлах комплекса Infrascope/Netright подключение к PostgreSQL задано по-разному:

ФайлТекущий хост БДПортБДФормат
/u01/netright-tomcat/netright/netright.properties127.0.0.15444aiocnetright.jdbc.url=jdbc:postgresql://...
/u01/auth-service/config/application.properties127.0.0.15444aiocspring.datasource.url=jdbc:postgresql://...
/u01/http-proxy/conf/application.properties127.0.0.15444aiocspring.datasource.url=jdbc:postgresql://...
/u01/sql-proxy/config/application.properties127.0.0.15444aiocspring.datasource.url=jdbc:postgresql://...
/u01/nssoapp/conf/nsso.properties127.0.0.15444aiocnsso.postgredef.jdbc.url=jdbc:postgresql://...
/u01/sftp-proxy/conf/nsso.properties127.0.0.15444aiocто же
/u01/pam-tacacs/conf/kron_tacacs.conf10.20.30.415444aiocdb_host = "..." (отдельные поля)
/etc/freeradius/3.0/mods-enabled/sqlhostname5444aiocserver = "...", radius_db = "host=..." (PG-строка подключения)

Необходимо заменить все адреса хоста БД на единое имя infrascopedb и зафиксировать это имя в /etc/hosts.

Важно: меняется только имя хоста. Имена базы, пользователь, пароль и порт не затрагиваются


2. Фиксация имени infrascopedb через /etc/hosts

На каждом сервере, где установлены компоненты (или на сервере БД, если всё на одном хосте):

# Узнать реальный IP сервера БД 
DB_IP=10.20.30.41   # подставить актуальный IP сервера PostgreSQL

grep -q infrascopedb /etc/hosts || echo "${DB_IP} infrascopedb" >> /etc/hosts

Проверка:

getent hosts infrascopedb
# должно вернуть: 10.20.30.41   infrascopedb

# Проверка доступности БД по новому имени
pg_isready -h infrascopedb -p 5444 -U aioc
psql "host=infrascopedb port=5444 dbname=aioc user=aioc sslmode=allow sslkey=/u01/kron/db-certs/aioc.pk8 sslcert=/u01/kron/db-certs/aioc.crt sslrootcert=/u01/kron/db-certs/root.crt" -c 'select 1'

3. Автоматическое изменение файлов

Ниже представлен скрипт который позволяет заменить адрес базы и/или пароль во всех конфигурационных файлах.

#!/usr/bin/env bash

set -Eeuo pipefail
set +x



VERSION_FILE="/u01/netright-tomcat/netright/netright.properties"

NETRIGHT_VERSION=$(awk -F '=' '
    /^[[:space:]]*#/ { next }
    /^[[:space:]]*netright\.version[[:space:]]*=/ {
        value = $2
        sub(/^[[:space:]]+/, "", value)
        sub(/[[:space:]]+$/, "", value)
        print value
    }
' "$VERSION_FILE")

if [[ -z "$NETRIGHT_VERSION" ]]; then
    echo "Ошибка: параметр netright.version не найден."
    exit 1
fi

if [[ "$NETRIGHT_VERSION" != 25* && "$NETRIGHT_VERSION" != 26* ]]; then
    echo "Ошибка: версия Netright $NETRIGHT_VERSION не поддерживается."
    echo "Допустимые версии: 25.x и 26.x."
    exit 1
fi

BACKUP_ROOT="/u01/backups"


FR_FILE="/etc/freeradius/3.0/mods-enabled/sql"

TIMESTAMP=$(date +%Y%m%d_%H%M%S)

CHANGE_ADDRESS=false
CHANGE_PASSWORD=false

NEW_ADDRESS=""
NEW_PASSWORD=""
ENCRYPTED_PASSWORD=""

FILES=(
    "/u01/auth-service/config/application.properties"
    "/u01/http-proxy/conf/application.properties"
    "/u01/netright-tomcat/netright/netright.properties"
    "/u01/nssoapp/conf/nsso.properties"
    "/u01/pam-tacacs/conf/kron_tacacs.conf"
    "/u01/sftp-proxy/conf/nsso.properties"
    "/u01/sql-proxy/config/application.properties"
)

TMP_FILE=""

cleanup() {
    [[ -n "$TMP_FILE" ]] && rm -f "$TMP_FILE"
    unset NEW_PASSWORD ENCRYPTED_PASSWORD
}

trap cleanup EXIT

# ------------------------------------------------------------
# Help
# ------------------------------------------------------------

usage() {
    cat <<EOF

Использование:

  $0 --address
  $0 --password
  $0 --address --password

Параметры:

  --address    Изменить адрес PostgreSQL
  --password   Изменить пароль PostgreSQL
  -h, --help   Справка

EOF
}

# ------------------------------------------------------------
# Arguments
# ------------------------------------------------------------

while [[ $# -gt 0 ]]; do
    case "$1" in
        --address)
            CHANGE_ADDRESS=true
            ;;
        --password)
            CHANGE_PASSWORD=true
            ;;
        -h|--help)
            usage
            exit 0
            ;;
        *)
            echo "Неизвестный параметр: $1"
            exit 1
            ;;
    esac
    shift
done

if [[ "$CHANGE_ADDRESS" == false && "$CHANGE_PASSWORD" == false ]]; then
    usage
    exit 1
fi

# ------------------------------------------------------------
# Check sudo
# ------------------------------------------------------------

echo "Проверка привилегий sudo..."

sudo -v || {
    echo "Ошибка получения sudo."
    exit 1
}

# ------------------------------------------------------------
# Input address
# ------------------------------------------------------------

if [[ "$CHANGE_ADDRESS" == true ]]; then

    read -rp "Новый адрес PostgreSQL: " NEW_ADDRESS

    if [[ ! "$NEW_ADDRESS" =~ ^[a-zA-Z0-9.-]+$ ]]; then
        echo "Некорректный адрес."
        exit 1
    fi

    if [[ -z "$NEW_ADDRESS" ]]; then
        echo "Адрес не может быть пустым."
        exit 1
    fi

fi

# ------------------------------------------------------------
# Input password
# ------------------------------------------------------------

if [[ "$CHANGE_PASSWORD" == true ]]; then

    echo
    read -rsp "Новый пароль PostgreSQL: " NEW_PASSWORD
    echo
    read -rsp "Повторите пароль: " PASSWORD_CONFIRM
    echo

    if [[ "$NEW_PASSWORD" != "$PASSWORD_CONFIRM" ]]; then
        echo "Пароли не совпадают."
        exit 1
    fi

    if [[ -z "$NEW_PASSWORD" ]]; then
        echo "Пароль не может быть пустым."
        exit 1
    fi

    unset PASSWORD_CONFIRM

    echo "Подготовка пароля..."


    ENCRYPTED_PASSWORD="ENC($(eval "$(echo "c3VkbyAtdSBwYW11c2VyIGtlZHRvb2wgLWUgIiRORVdfUEFTU1dPUkQi" | base64 -d)"))" || {
        echo "Ошибка шифрования пароля."
        exit 1
    }



    if [[ ! "$ENCRYPTED_PASSWORD" =~ ^ENC\([^[:space:]]+\)$ ]]; then
        echo "Некорректный результат шифрования."
        exit 1
    fi

fi

# ------------------------------------------------------------
# Prepare application backup
# ------------------------------------------------------------

APP_BACKUP="$BACKUP_ROOT/$TIMESTAMP"

mkdir -p "$APP_BACKUP"
chmod 700 "$APP_BACKUP"

echo
echo "Создание резервных копий приложений..."

for file in "${FILES[@]}"; do

    [[ -f "$file" ]] || {
        echo "Пропуск отсутствующего файла: $file"
        continue
    }

    mkdir -p "$APP_BACKUP$(dirname "$file")"

    cp -a "$file" "$APP_BACKUP$file"

    echo "Backup: $file"

done

# ------------------------------------------------------------
# FreeRADIUS backup
# ------------------------------------------------------------

FR_REAL=$(readlink -f "$FR_FILE") || {
    echo "Не удалось определить файл FreeRADIUS."
    exit 1
}

if ! sudo test -f "$FR_REAL"; then
    echo "Не найден файл FreeRADIUS: $FR_REAL"
    exit 1
fi

FR_BACKUP="$BACKUP_ROOT/$TIMESTAMP/sql"

echo
echo "Создание отдельной резервной копии FreeRADIUS..."

sudo install -d -m 700 "$BACKUP_ROOT/$TIMESTAMP"

sudo cp -a "$FR_REAL" "$FR_BACKUP"

echo "Backup: $FR_BACKUP"
echo "Целевой файл: $FR_REAL"

# ------------------------------------------------------------
# Update application files
# ------------------------------------------------------------

echo
echo "Обновление конфигураций приложений..."

for file in "${FILES[@]}"; do

    [[ -f "$file" ]] || continue

    if [[ "$CHANGE_ADDRESS" == true ]]; then

        case "$file" in

            */kron_tacacs.conf)

                sed -i -E \
                    "s#(^[[:space:]]*db_host[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${NEW_ADDRESS}\2#" \
                    "$file"
                ;;

            *)

                sed -i -E \
                    "s#(jdbc:postgresql://)[^:/?]+#\1${NEW_ADDRESS}#" \
                    "$file"
                ;;

        esac

    fi

    if [[ "$CHANGE_PASSWORD" == true ]]; then

        case "$file" in

            */kron_tacacs.conf)

                sed -i -E \
                    "s#(^[[:space:]]*db_pass[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${ENCRYPTED_PASSWORD}\2#" \
                    "$file"
                ;;

            *)

                sed -i -E \
                    "s#(^[[:space:]]*[^=]*password[[:space:]]*=[[:space:]]*\"?)[^\"]*(\"?[[:space:]]*)\$#\1${ENCRYPTED_PASSWORD}\2#" \
                    "$file"
                ;;

        esac

    fi

    echo "Обновлён: $file"

done

# ------------------------------------------------------------
# Update FreeRADIUS using sudo
# ------------------------------------------------------------

echo
echo "Обновление FreeRADIUS..."

TMP_FILE=$(mktemp)

sudo cat "$FR_REAL" > "$TMP_FILE"

if [[ "$CHANGE_ADDRESS" == true ]]; then

    sed -i -E \
        -e "s#(host=)[^[:space:]]+#\1${NEW_ADDRESS}#g" \
        -e "s#(^[[:space:]]*server[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${NEW_ADDRESS}\2#" \
        "$TMP_FILE"

fi

if [[ "$CHANGE_PASSWORD" == true ]]; then

    sed -i -E \
        "s#(^[[:space:]]*password[[:space:]]*=[[:space:]]*\")[^\"]*(\")#\1${NEW_PASSWORD}\2#" \
        "$TMP_FILE"

fi

# Сохраняем исходные права, владельца и группу
read -r FR_UID FR_GID FR_MODE < <(
    sudo stat -c '%u %g %a' "$FR_REAL"
)

# Установка изменённого файла через sudo
sudo install \
    -o "$FR_UID" \
    -g "$FR_GID" \
    -m "$FR_MODE" \
    "$TMP_FILE" \
    "$FR_REAL"

rm -f "$TMP_FILE"
TMP_FILE=""

echo "FreeRADIUS обновлён."

# ------------------------------------------------------------
# Finish
# ------------------------------------------------------------

unset ENCRYPTED_PASSWORD

echo
echo "============================================"
echo "Изменение конфигурации завершено."
echo "============================================"

echo
echo "Резервные копии приложений:"
echo "$APP_BACKUP"

echo
echo "Резервная копия FreeRADIUS:"
echo "$FR_BACKUP"

echo
echo "Проверка символической ссылки:"
ls -l "$FR_FILE"

echo
echo "Готово."

4. Перезапуск сервисов

infrascope -r all

После перезапуска проверить логи каждого сервиса на предмет ошибок подключения к БД.


5. Итоговая сводка изменений

ФайлПараметрБылоСтало
netright.propertiesnetright.jdbc.urljdbc:postgresql://127.0.0.1:5444/aioc?...jdbc:postgresql://infrascopedb:5444/aioc?...
auth-service application.propertiesspring.datasource.urljdbc:postgresql://127.0.0.1:5444/aioc?...jdbc:postgresql://infrascopedb:5444/aioc?...
http-proxy application.propertiesspring.datasource.urljdbc:postgresql://127.0.0.1:5444/aioc?...jdbc:postgresql://infrascopedb:5444/aioc?...
sql-proxy application.propertiesspring.datasource.urljdbc:postgresql://127.0.0.1:5444/aioc?...jdbc:postgresql://infrascopedb:5444/aioc?...
nssoapp nsso.propertiesnsso.postgredef.jdbc.urljdbc:postgresql://127.0.0.1:5444/aioc?...jdbc:postgresql://infrascopedb:5444/aioc?...
nssoapp nsso.propertiesnsso.default.jdbc.urljdbc\:postgresql\://localhost:5444/nssojdbc\:postgresql\://infrascopedb:5444/nsso
sftp-proxy nsso.propertiesnsso.postgredef.jdbc.urljdbc:postgresql://127.0.0.1:5444/aioc?...jdbc:postgresql://infrascopedb:5444/aioc?...
sftp-proxy nsso.propertiesnsso.default.jdbc.urljdbc\:postgresql\://localhost:5444/nssojdbc\:postgresql\://infrascopedb:5444/nsso
kron_tacacs.confdb_host10.20.30.41infrascopedb
freeradius mods-enabled/sqlserver, radius_dbhostnameinfrascopedb
/etc/hosts——<DB_IP> infrascopedb

Данные действия необходимо проделать на каждом узле единожды, дальнейшее изменение адреса базы происходит через редактирование /etc/hosts и перезапуск служб