123 lines
4.2 KiB
Python
Executable File
123 lines
4.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
|
||
import urllib.request
|
||
import urllib.parse
|
||
import base64
|
||
import time
|
||
import os
|
||
|
||
USERNAME = os.getenv("KEENETIC_USERNAME", "admin")
|
||
PASSWORD = os.getenv("KEENETIC_PASSWORD", None)
|
||
KEENETIC_HOST = os.getenv("KEENETIC_HOST", "192.168.0.1")
|
||
INTERFACE = os.getenv("KEENETIC_INTERFACE", "Proxy0")
|
||
|
||
CUSTOM_CIDR_LIST = [
|
||
# Youtube
|
||
"64.18.0.0/20",
|
||
"64.233.160.0/19",
|
||
"66.102.0.0/20",
|
||
"66.249.80.0/20",
|
||
"72.14.192.0/18",
|
||
"74.125.0.0/16",
|
||
"173.194.0.0/16",
|
||
"207.126.144.0/20",
|
||
"209.85.128.0/17",
|
||
"216.58.208.0/20",
|
||
"216.239.32.0/19",
|
||
"213.0.0.0/8",
|
||
]
|
||
|
||
|
||
def cidr_to_netmask(cidr):
|
||
"""Преобразует префикс CIDR в маску подсети."""
|
||
try:
|
||
ip, prefix_length = cidr.split("/")
|
||
prefix_length = int(prefix_length)
|
||
|
||
# Создаем маску подсети из префикса
|
||
mask = (0xFFFFFFFF >> (32 - prefix_length)) << (32 - prefix_length)
|
||
netmask = ".".join([str((mask >> (i * 8)) & 0xFF) for i in range(4)[::-1]])
|
||
|
||
return ip, netmask
|
||
except ValueError:
|
||
raise ValueError("Неверный формат CIDR")
|
||
|
||
|
||
def fetch_cidr_list(url):
|
||
"""Загружает список CIDR из указанного URL."""
|
||
with urllib.request.urlopen(url) as response:
|
||
return response.read().decode().splitlines()
|
||
|
||
|
||
def add_route_to_keenetic(ip, netmask, gateway, username, password):
|
||
"""Добавляет маршрут на роутер Keenetic с использованием GET-запроса."""
|
||
url = f"http://{KEENETIC_HOST}/cgi-bin/luci/admin/network/routes"
|
||
params = {"ip": ip, "mask": netmask, "gateway": gateway, "interface": INTERFACE}
|
||
|
||
# Кодируем параметры для URL
|
||
query_string = urllib.parse.urlencode(params)
|
||
full_url = f"{url}?{query_string}"
|
||
|
||
# Создаем запрос
|
||
request = urllib.request.Request(full_url)
|
||
request.add_header("Content-Type", "application/x-www-form-urlencoded")
|
||
|
||
# Аутентификация
|
||
credentials = f"{username}:{password}"
|
||
base64_credentials = base64.b64encode(credentials.encode()).decode()
|
||
request.add_header("Authorization", f"Basic {base64_credentials}")
|
||
|
||
# Отправка запроса
|
||
try:
|
||
with urllib.request.urlopen(request) as response:
|
||
print(f"Маршрут {ip} с маской {netmask} успешно добавлен.")
|
||
return True
|
||
except Exception as e:
|
||
print(f"Ошибка при добавлении маршрута {ip}: {e}")
|
||
return False
|
||
|
||
|
||
def add_routes_to_keenetic(routes, gateway, username, password, max_retries=3):
|
||
"""Добавляет маршруты на роутер Keenetic с повторными попытками."""
|
||
for route in routes:
|
||
ip, netmask = route
|
||
success = False
|
||
attempts = 0
|
||
|
||
while not success and attempts < max_retries:
|
||
success = add_route_to_keenetic(ip, netmask, gateway, username, password)
|
||
if not success:
|
||
attempts += 1
|
||
print(f"Попытка {attempts} для маршрута {ip}.")
|
||
time.sleep(2) # Задержка перед повторной попыткой
|
||
|
||
|
||
def main():
|
||
url = "https://antifilter.download/list/allyouneed.lst"
|
||
if PASSWORD is None:
|
||
print(
|
||
"Для использования данного скрипта необходимо установить переменные окружения KEENETIC_USERNAME и KEENETIC_PASSWORD."
|
||
)
|
||
return
|
||
|
||
try:
|
||
cidr_list = fetch_cidr_list(url)
|
||
cidr_list.extend(CUSTOM_CIDR_LIST)
|
||
routes_to_add = []
|
||
|
||
# Генерируем маршруты
|
||
for cidr in cidr_list:
|
||
if cidr.strip(): # Проверяем, что строка не пустая
|
||
ip, netmask = cidr_to_netmask(cidr.strip())
|
||
routes_to_add.append((ip, netmask))
|
||
|
||
# Добавляем маршруты пачками
|
||
add_routes_to_keenetic(routes_to_add, KEENETIC_HOST, USERNAME, PASSWORD)
|
||
except Exception as e:
|
||
print(f"Ошибка: {e}")
|
||
|
||
|
||
# Пример использования
|
||
if __name__ == "__main__":
|
||
main()
|