-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
64 lines (52 loc) · 2.6 KB
/
Copy pathmain.py
File metadata and controls
64 lines (52 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import os
from dotenv import load_dotenv
from py3xui import Api
def sync(slave_url):
# Инициализация API
master = Api(MASTER_URL, MASTER_USER, MASTER_PASS)
slave = Api(slave_url, SLAVE_USER, SLAVE_PASS)
try:
master.login()
slave.login()
except Exception as e:
print(f"Ошибка авторизации: {e}")
return
# 1. Получаем все инбаунды с обоих серверов
master_inbounds = master.inbound.get_list()
slave_inbounds = slave.inbound.get_list()
for target_name in TO_SYNC:
# Ищем оригинал на мастере
source = next((i for i in master_inbounds if i.remark == target_name), None)
if not source:
print(f"[-] Инбаунд '{target_name}' не найден на мастере.")
continue
# Ищем существующий на слейве для замены
existing = next((i for i in slave_inbounds if i.remark == target_name), None)
if existing:
if existing.model_dump(include=COMPARE_PARAMS) == source.model_dump(include=COMPARE_PARAMS):
print("[!] Конфигурация уже обновлена, пропуск")
continue
print(f"[*] Обновляем существующий '{target_name}' на слейве (ID: {existing.id})")
source.id = existing.id
try:
# Используем метод update вместо add
slave.inbound.update(existing.id, source)
print(f"[+] '{target_name}' успешно обновлен.")
except Exception as e:
print(f"[!] Ошибка при обновлении: {e}")
else:
# Если на слейве такого еще нет — создаем с нуля
try:
print(f"[*] '{target_name}' не найден на слейве. Создаем новый...")
slave.inbound.add(source)
except Exception as e:
print(f"[!] Ошибка при добавлении: {e}")
if __name__ == "__main__":
load_dotenv()
MASTER_URL, MASTER_USER, MASTER_PASS, SLAVE_URLS, SLAVE_USER, SLAVE_PASS, COMPARE_PARAMS, TO_SYNC = [
os.getenv(key) for key in "MASTER_URL, MASTER_USER, MASTER_PASS, SLAVE_URLS, SLAVE_USER, SLAVE_PASS, COMPARE_PARAMS, TO_SYNC".split(", ")]
TO_SYNC = TO_SYNC.split()
SLAVE_URLS = SLAVE_URLS.split()
COMPARE_PARAMS = COMPARE_PARAMS.split()
for slave_url in SLAVE_URLS:
sync(slave_url)