Сделаны подписки и переделаны роуты
This commit is contained in:
128
tests/add.py
Normal file
128
tests/add.py
Normal file
@@ -0,0 +1,128 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user