Files
Phantom/release/docker/generate-config.sh

204 lines
7.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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
<?xml version="1.0" encoding="UTF-8"?>
<phantom_config>
<!-- Сетевые настройки -->
<network>
<ip>$container_ip</ip>
<port>$listen_port</port>
<kad_port>$kad_port</kad_port>
</network>
<!-- Параметры алгоритма построения путей -->
<path_construction>
<nxnodes>$nxnodes</nxnodes>
<nynodes>$nynodes</nynodes>
<nkeys>$nkeys</nkeys>
</path_construction>
<!-- Kademlia DHT настройки -->
<kademlia>
<node_file>/home/phantom/data/kad_nodes.dat</node_file>
<data_dir>/home/phantom/data/kad_data</data_dir>
</kademlia>
<!-- Криптографические материалы -->
<certificates>
<construction>
<certificate>$key_dir/${node_name}_construction.crt</certificate>
<private_key>$key_dir/${node_name}_construction.key</private_key>
</construction>
<communication>
<certificate>$key_dir/${node_name}_communication.crt</certificate>
<private_key>$key_dir/${node_name}_communication.key</private_key>
</communication>
<routing>
<certificate>$key_dir/${node_name}_routing.crt</certificate>
<private_key>$key_dir/${node_name}_routing.key</private_key>
</routing>
</certificates>
<!-- Логирование -->
<logging>
<level>${PHANTOM_LOG_LEVEL:-INFO}</level>
<file>/home/phantom/logs/${node_name}.log</file>
</logging>
<!-- Дополнительные настройки -->
<advanced>
<max_connections>${PHANTOM_MAX_CONNECTIONS:-100}</max_connections>
<connection_timeout>${PHANTOM_CONNECTION_TIMEOUT:-30}</connection_timeout>
<path_lifetime>${PHANTOM_PATH_LIFETIME:-3600}</path_lifetime>
</advanced>
</phantom_config>
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