| |
|
|
| import os |
| import sys |
| import yaml |
| import json |
| import uuid |
| import sqlite3 |
|
|
| sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) |
|
|
| from datetime import datetime, UTC |
| from werkzeug.security import generate_password_hash |
| from tools.storage import Storage |
| from tools.identity import generate_did |
| from tools.crypto import generate_keypair |
|
|
| CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yml") |
| DB_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "agent_data.db")) |
|
|
| 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.now(UTC).isoformat(), |
| "updated_at": datetime.now(UTC).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.now(UTC).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(): |
| for folder in ["logs", "scripts"]: |
| full_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", folder)) |
| if not os.path.exists(full_path): |
| os.makedirs(full_path) |
| print(f"[+] Создан каталог: {full_path}") |
| else: |
| print(f"[=] Каталог уже существует: {full_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) |
|
|
| if not is_db_initialized(DB_PATH): |
| print("[*] БД не инициализирована — выполняем инициализацию.") |
| try: |
| ensure_directories() |
| storage = Storage() |
| 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() |
|
|