#!/bin/bash # Скрипт генерации конфигурации для Phantom Protocol set -e # Параметры NODE_NAME="$1" CONFIG_FILE="$2" if [ -z "$NODE_NAME" ] || [ -z "$CONFIG_FILE" ]; then echo "Использование: $0 <имя_узла> <файл_конфигурации>" exit 1 fi # Функция логирования log() { echo "[CONFIG] $1" } # Функция генерации ключей generate_keys() { local key_dir="/home/phantom/keys" local node_name="$1" log "Генерация криптографических ключей для узла $node_name" # Создание директории для ключей mkdir -p "$key_dir" # Генерация приватного ключа для построения путей (construction) if [ ! -f "$key_dir/${node_name}_construction.key" ]; then openssl genpkey -algorithm RSA -pkcs8 -out "$key_dir/${node_name}_construction.key" -pkeyopt rsa_keygen_bits:2048 log "Сгенерирован ключ построения: ${node_name}_construction.key" fi # Генерация сертификата для построения путей if [ ! -f "$key_dir/${node_name}_construction.crt" ]; then openssl req -new -x509 -key "$key_dir/${node_name}_construction.key" \ -out "$key_dir/${node_name}_construction.crt" -days 365 \ -subj "/C=XX/ST=Anonymous/L=Phantom/O=PhantomProtocol/OU=Construction/CN=$node_name" log "Сгенерирован сертификат построения: ${node_name}_construction.crt" fi # Генерация ключа для коммуникации if [ ! -f "$key_dir/${node_name}_communication.key" ]; then openssl genpkey -algorithm RSA -pkcs8 -out "$key_dir/${node_name}_communication.key" -pkeyopt rsa_keygen_bits:2048 log "Сгенерирован ключ коммуникации: ${node_name}_communication.key" fi # Генерация сертификата для коммуникации if [ ! -f "$key_dir/${node_name}_communication.crt" ]; then openssl req -new -x509 -key "$key_dir/${node_name}_communication.key" \ -out "$key_dir/${node_name}_communication.crt" -days 365 \ -subj "/C=XX/ST=Anonymous/L=Phantom/O=PhantomProtocol/OU=Communication/CN=$node_name" log "Сгенерирован сертификат коммуникации: ${node_name}_communication.crt" fi # Генерация ключа для маршрутизации if [ ! -f "$key_dir/${node_name}_routing.key" ]; then openssl genpkey -algorithm RSA -pkcs8 -out "$key_dir/${node_name}_routing.key" -pkeyopt rsa_keygen_bits:2048 log "Сгенерирован ключ маршрутизации: ${node_name}_routing.key" fi # Генерация сертификата для маршрутизации if [ ! -f "$key_dir/${node_name}_routing.crt" ]; then openssl req -new -x509 -key "$key_dir/${node_name}_routing.key" \ -out "$key_dir/${node_name}_routing.crt" -days 365 \ -subj "/C=XX/ST=Anonymous/L=Phantom/O=PhantomProtocol/OU=Routing/CN=$node_name" log "Сгенерирован сертификат маршрутизации: ${node_name}_routing.crt" fi # Установка правильных прав доступа chmod 600 "$key_dir"/*.key chmod 644 "$key_dir"/*.crt log "Генерация ключей завершена" } # Функция создания конфигурационного файла create_config() { local node_name="$1" local config_file="$2" local key_dir="/home/phantom/keys" log "Создание конфигурационного файла: $config_file" # Получение IP адреса контейнера local container_ip container_ip=$(hostname -i 2>/dev/null | awk '{print $1}' || echo "127.0.0.1") # Параметры из переменных окружения с значениями по умолчанию local listen_port="${PHANTOM_PORT:-8080}" local kad_port="${PHANTOM_KAD_PORT:-8081}" local nxnodes="${PHANTOM_NXNODES:-3}" local nynodes="${PHANTOM_NYNODES:-3}" local nkeys="${PHANTOM_NKEYS:-3}" # Создание XML конфигурации cat > "$config_file" << EOF $container_ip $listen_port $kad_port $nxnodes $nynodes $nkeys /home/phantom/data/kad_nodes.dat /home/phantom/data/kad_data $key_dir/${node_name}_construction.crt $key_dir/${node_name}_construction.key $key_dir/${node_name}_communication.crt $key_dir/${node_name}_communication.key $key_dir/${node_name}_routing.crt $key_dir/${node_name}_routing.key ${PHANTOM_LOG_LEVEL:-INFO} /home/phantom/logs/${node_name}.log ${PHANTOM_MAX_CONNECTIONS:-100} ${PHANTOM_CONNECTION_TIMEOUT:-30} ${PHANTOM_PATH_LIFETIME:-3600} EOF log "Конфигурационный файл создан: $config_file" } # Функция создания файла начальных узлов Kademlia create_bootstrap_nodes() { local data_dir="/home/phantom/data" local nodes_file="$data_dir/kad_nodes.dat" mkdir -p "$data_dir" # Если файл узлов не существует и заданы bootstrap узлы if [ ! -f "$nodes_file" ] && [ -n "$PHANTOM_BOOTSTRAP_NODES" ]; then log "Создание файла начальных узлов Kademlia" # Формат: ip:port,ip:port,... IFS=',' read -ra NODES <<< "$PHANTOM_BOOTSTRAP_NODES" for node in "${NODES[@]}"; do echo "$node" >> "$nodes_file" done log "Добавлено ${#NODES[@]} начальных узлов" fi } # Основная функция main() { log "=== Генерация конфигурации для узла $NODE_NAME ===" # Создание необходимых директорий mkdir -p "$(dirname "$CONFIG_FILE")" mkdir -p "/home/phantom/logs" mkdir -p "/home/phantom/data" # Генерация криптографических ключей generate_keys "$NODE_NAME" # Создание конфигурационного файла create_config "$NODE_NAME" "$CONFIG_FILE" # Создание файла начальных узлов create_bootstrap_nodes log "Конфигурация для узла $NODE_NAME готова" log "Файл конфигурации: $CONFIG_FILE" } # Запуск основной функции main