204 lines
7.9 KiB
Bash
204 lines
7.9 KiB
Bash
#!/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
|
||
|