import argparse from datetime import datetime import json import base64 from pymongo import MongoClient def connect_to_mongo(uri, db_name): """Подключение к MongoDB.""" client = MongoClient(uri) db = client[db_name] return db def load_raw_json(json_path): """Загружает сырые JSON-данные из файла.""" with open(json_path, "r", encoding="utf-8") as f: return json.loads(f.read()) def encode_file(file_path): """Читает файл и кодирует его в Base64.""" with open(file_path, "rb") as f: return base64.b64encode(f.read()).decode("utf-8") def transform_data(raw_data): """Преобразует исходные сырые данные в целевую структуру.""" try: settings = json.loads(raw_data["obj"]["settings"]) stream_settings = json.loads(raw_data["obj"]["streamSettings"]) sniffing_settings = json.loads(raw_data["obj"]["sniffing"]) transformed = { "server": { "name": raw_data["obj"].get("remark", "Unknown"), "ip": "45.82.255.110", # Замените на актуальные данные "port": "2053", "secretKey": "Hd8OsqN5Jh", # Замените на актуальные данные "login": "nc1450nP", # Замените на актуальные данные "password": "KmajQOuf" # Замените на актуальные данные }, "clients": [ { "email": client["email"], "inboundId": raw_data["obj"].get("id"), "id": client["id"], "flow": client.get("flow", ""), "limits": { "ipLimit": client.get("limitIp", 0), "reset": client.get("reset", 0), "totalGB": client.get("totalGB", 0) }, "subscriptions": { "subId": client.get("subId", ""), "tgId": client.get("tgId", "") } } for client in settings["clients"] ], "connection": { "destination": stream_settings["realitySettings"].get("dest", ""), "serverNames": stream_settings["realitySettings"].get("serverNames", []), "security": stream_settings.get("security", ""), "publicKey": stream_settings["realitySettings"]["settings"].get("publicKey", ""), "fingerprint": stream_settings["realitySettings"]["settings"].get("fingerprint", ""), "shortIds": stream_settings["realitySettings"].get("shortIds", []), "tcpSettings": { "acceptProxyProtocol": stream_settings["tcpSettings"].get("acceptProxyProtocol", False), "headerType": stream_settings["tcpSettings"]["header"].get("type", "none") }, "sniffing": { "enabled": sniffing_settings.get("enabled", False), "destOverride": sniffing_settings.get("destOverride", []) } } } return transformed except KeyError as e: raise ValueError(f"Ошибка преобразования данных: отсутствует ключ {e}") def insert_certificate(data, cert_path, cert_location): """Добавляет сертификат в указанное место внутри структуры JSON.""" # Читаем и кодируем сертификат certificate_data = encode_file(cert_path) # Разбиваем путь на вложенные ключи keys = cert_location.split(".") target = data for key in keys[:-1]: if key not in target: target[key] = {} # Создаем вложенные ключи, если их нет target = target[key] target[keys[-1]] = { "data": certificate_data, "uploaded_at": datetime.utcnow() } def insert_data(db, collection_name, data): """Вставляет данные в указанную коллекцию MongoDB.""" collection = db[collection_name] collection.insert_one(data) print(f"Данные успешно вставлены в коллекцию '{collection_name}'.") def main(): parser = argparse.ArgumentParser(description="Insert raw JSON data into MongoDB with certificate") parser.add_argument("--mongo-uri", default="mongodb://root:itOj4CE2miKR@mongodb:27017", help="MongoDB URI") parser.add_argument("--db-name", default="MongoDBSub&Ser", help="MongoDB database name") parser.add_argument("--collection", default="servers", help="Collection name") parser.add_argument("--json-path", required=True, help="Path to the JSON file with raw data") parser.add_argument("--cert-path", help="Path to the certificate file (.crt)") parser.add_argument("--cert-location", default='server.certificate', help="Path inside JSON structure to store certificate (e.g., 'server.certificate')") args = parser.parse_args() # Подключение к MongoDB db = connect_to_mongo(args.mongo_uri, args.db_name) # Загрузка сырых данных из JSON-файла raw_data = load_raw_json(args.json_path) # Преобразование данных в нужную структуру transformed_data = transform_data(raw_data) # Вставка сертификата в структуру данных (если путь к сертификату указан) if args.cert_path: insert_certificate(transformed_data, args.cert_path, args.cert_location) # Вставка данных в MongoDB insert_data(db, args.collection, transformed_data) if __name__ == "__main__": main()