|
|
|
|
|
import os |
|
import sys |
|
import yaml |
|
import json |
|
import time |
|
import uuid |
|
import sqlite3 |
|
|
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) |
|
|
|
from datetime import datetime |
|
from werkzeug.security import generate_password_hash |
|
from tools.storage import Storage |
|
from tools.identity import generate_did |
|
from tools.crypto import generate_keypair |
|
from tools.config_utils import update_config |
|
|
|
CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yml") |
|
|
|
def load_config(path): |
|
with open(path, 'r', encoding='utf-8') as f: |
|
return yaml.safe_load(f) |
|
|
|
def save_config(path, config): |
|
with open(path, 'w', encoding='utf-8') as f: |
|
yaml.dump(config, f, allow_unicode=True) |
|
|
|
def init_identity(storage, config): |
|
if not config.get("agent_id"): |
|
did = generate_did() |
|
pubkey, privkey = generate_keypair() |
|
identity_id = did.split(":")[-1] |
|
|
|
identity = { |
|
"id": identity_id, |
|
"name": config.get("agent_name", "Unnamed"), |
|
"pubkey": pubkey, |
|
"privkey": privkey, |
|
"metadata": json.dumps({"role": config.get("agent_role", "core")}), |
|
"created_at": datetime.utcnow().isoformat(), |
|
"updated_at": datetime.utcnow().isoformat() |
|
} |
|
storage.add_identity(identity) |
|
|
|
|
|
config["agent_id"] = did |
|
config["identity_agent"] = identity_id |
|
save_config(CONFIG_PATH, config) |
|
print(f"[+] Создана личность: {identity_id}") |
|
else: |
|
print("[=] agent_id уже задан, пропускаем генерацию DiD.") |
|
|
|
def init_user(storage, config): |
|
user = config.get("default_user", {}) |
|
if not user.get("email"): |
|
print("[-] Не указан email пользователя — пропуск.") |
|
return |
|
password = user.get("password") |
|
if not password: |
|
print("[-] Не указан пароль пользователя — пропуск.") |
|
return |
|
password_hash = generate_password_hash(password) |
|
|
|
did = generate_did() |
|
user_entry = { |
|
"username": user.get("username", "user"), |
|
"mail": user["email"], |
|
"password_hash": password_hash, |
|
"did": did, |
|
"ban": None, |
|
"info": json.dumps({}), |
|
"contacts": json.dumps([]), |
|
"language": "ru,en", |
|
"operator": 1 |
|
} |
|
storage.add_user(user_entry) |
|
|
|
print(f"[+] Пользователь {user['username']} добавлен.") |
|
|
|
def init_llm_backends(storage, config): |
|
backends = config.get("llm_backends", []) |
|
storage.clear_llm_registry() |
|
for backend in backends: |
|
backend_id = str(uuid.uuid4()) |
|
desc = f"{backend.get('type', 'unknown')} model" |
|
llm = { |
|
"id": backend_id, |
|
"name": backend["name"], |
|
"endpoint": desc, |
|
"metadata": json.dumps(backend), |
|
"created_at": datetime.utcnow().isoformat() |
|
} |
|
storage.add_llm(llm) |
|
print(f"[+] Зарегистрирован LLM: {backend['name']}") |
|
|
|
def init_config_table(storage, config): |
|
exclude_keys = {"default_user", "llm_backends"} |
|
flat_config = {k: v for k, v in config.items() if k not in exclude_keys} |
|
for key, value in flat_config.items(): |
|
storage.set_config(key, json.dumps(value)) |
|
print("[+] Конфигурация сохранена в БД.") |
|
|
|
def ensure_directories(config): |
|
directories = [ |
|
config.get("data_dir", "./data"), |
|
config.get("log_dir", "./logs"), |
|
|
|
] |
|
|
|
for path in directories: |
|
if path and not os.path.exists(path): |
|
os.makedirs(path) |
|
print(f"[+] Создан каталог: {path}") |
|
else: |
|
print(f"[=] Каталог уже существует: {path}") |
|
|
|
def is_db_initialized(db_path): |
|
if not os.path.exists(db_path): |
|
return False |
|
try: |
|
with sqlite3.connect(db_path) as conn: |
|
cursor = conn.cursor() |
|
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'") |
|
return cursor.fetchone() is not None |
|
except Exception: |
|
return False |
|
|
|
def ensure_db_initialized(): |
|
config = load_config(CONFIG_PATH) |
|
db_path = config.get("db_path", "./data/agent_storage.db") |
|
|
|
if not is_db_initialized(db_path): |
|
print("[*] БД не инициализирована — выполняем инициализацию.") |
|
try: |
|
ensure_directories(config) |
|
storage = Storage(config) |
|
init_identity(storage, config) |
|
init_user(storage, config) |
|
init_llm_backends(storage, config) |
|
init_config_table(storage, config) |
|
save_config(CONFIG_PATH, config) |
|
except Exception as e: |
|
print(f"[!] Ошибка при инициализации: {e}") |
|
sys.exit(1) |
|
else: |
|
print("[=] БД уже инициализирована.") |
|
|
|
return config |
|
|
|
if __name__ == "__main__": |
|
ensure_db_initialized() |