fix: sync_routing baca dari address-list bgp-export (tidak timeout lagi)
This commit is contained in:
@@ -1,27 +1,23 @@
|
||||
/system/script remove [find name="bgp_lokal_export"]
|
||||
|
||||
/system/script add name=bgp_lokal_export dont-require-permissions=yes source={ \
|
||||
:local fname "bgp_lokal_export"; \
|
||||
:log info "BGP Export: mulai..."; \
|
||||
:local output ""; \
|
||||
/ip firewall address-list remove [find list="bgp-export"]; \
|
||||
:local cnt 0; \
|
||||
:foreach r in=[/routing/route find where distance=15] do={ \
|
||||
:local dst [/routing/route get \$r dst-address]; \
|
||||
:if (\$dst != "0.0.0.0/0" && \$dst != "::/0") do={ \
|
||||
:set output ("\$output\$dst\n"); \
|
||||
:set cnt (\$cnt + 1); \
|
||||
:local dst [/routing/route get $r dst-address]; \
|
||||
:if ($dst != "0.0.0.0/0" && $dst != "::/0") do={ \
|
||||
/ip firewall address-list add list="bgp-export" address=$dst; \
|
||||
:set cnt ($cnt + 1); \
|
||||
}; \
|
||||
}; \
|
||||
:log info "BGP Export: CDN selesai"; \
|
||||
:log info "BGP Export: CDN selesai ($cnt)"; \
|
||||
:foreach r in=[/routing/route find where distance=200] do={ \
|
||||
:local dst [/routing/route get \$r dst-address]; \
|
||||
:if (\$dst != "0.0.0.0/0" && \$dst != "::/0") do={ \
|
||||
:set output ("\$output\$dst\n"); \
|
||||
:set cnt (\$cnt + 1); \
|
||||
:local dst [/routing/route get $r dst-address]; \
|
||||
:if ($dst != "0.0.0.0/0" && $dst != "::/0") do={ \
|
||||
/ip firewall address-list add list="bgp-export" address=$dst; \
|
||||
:set cnt ($cnt + 1); \
|
||||
}; \
|
||||
}; \
|
||||
/file print file=\$fname; \
|
||||
:delay 2s; \
|
||||
/file set "\$fname.txt" contents=\$output; \
|
||||
:log info "BGP Export: selesai"; \
|
||||
:log info "BGP Export: selesai total $cnt rute"; \
|
||||
}
|
||||
|
||||
@@ -18,11 +18,12 @@ API_URL = f"http://{BGP_ROUTER_IP}/rest/routing/route"
|
||||
auth = (BGP_ROUTER_USER, BGP_ROUTER_PASSWORD)
|
||||
|
||||
def get_local_bgp_routes():
|
||||
"""Download file bgp_lokal_export.txt dari router BGP.
|
||||
"""Mengambil daftar IP lokal dari address-list 'bgp-export' di router BGP.
|
||||
|
||||
File ini diekspor secara berkala oleh scheduler MikroTik (bgp_lokal_scheduler)
|
||||
Address-list ini diisi secara berkala oleh scheduler MikroTik (bgp_lokal_scheduler)
|
||||
yang menjalankan script bgp_lokal_export setiap hari jam 04:00.
|
||||
File berisi daftar dst-address dari rute CDN (distance=15) dan NIX (distance=200).
|
||||
Script mengumpulkan dst-address dari rute CDN (distance=15) dan NIX (distance=200)
|
||||
lalu menulisnya ke address-list 'bgp-export'.
|
||||
"""
|
||||
import urllib3
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
@@ -34,54 +35,25 @@ def get_local_bgp_routes():
|
||||
session.verify = False
|
||||
|
||||
api_url = f"http://{BGP_ROUTER_IP}/rest"
|
||||
export_file = "bgp_lokal_export.txt"
|
||||
|
||||
# 1. Cek apakah file export ada di router
|
||||
print(f"Mengecek file {export_file} di router...")
|
||||
print("Mengambil address-list 'bgp-export' dari router...")
|
||||
try:
|
||||
res = session.get(f"{api_url}/file", params={"name": export_file}, timeout=10)
|
||||
if res.status_code == 200:
|
||||
files = res.json()
|
||||
if not files:
|
||||
print(f" -> File {export_file} tidak ditemukan di router!")
|
||||
print(" Pastikan script bgp_lokal_export sudah dibuat dan dijalankan di router.")
|
||||
print(" Lihat instruksi di setup_scheduler.md")
|
||||
return []
|
||||
|
||||
size = files[0].get("size", "0")
|
||||
print(f" -> File ditemukan ({size} bytes)")
|
||||
else:
|
||||
print(f" -> Error cek file: {res.status_code}")
|
||||
return []
|
||||
except Exception as e:
|
||||
print(f" -> Gagal koneksi ke router: {e}")
|
||||
return []
|
||||
|
||||
# 2. Download isi file via /execute :put
|
||||
print(f"Mengunduh isi {export_file}...")
|
||||
try:
|
||||
res = session.post(f"{api_url}/execute",
|
||||
json={"script": f':put [/file get {export_file} contents]'},
|
||||
res = session.get(f"{api_url}/ip/firewall/address-list",
|
||||
params={"list": "bgp-export", ".proplist": "address"},
|
||||
timeout=30)
|
||||
|
||||
if res.status_code == 200:
|
||||
content = res.json().get("ret", "")
|
||||
if content:
|
||||
# Parse: setiap baris adalah dst-address (contoh: 103.10.0.0/16)
|
||||
routes = [line.strip() for line in content.split("\n")
|
||||
if line.strip() and "/" in line.strip()]
|
||||
# Hapus default routes
|
||||
routes = [r for r in routes if r not in ("0.0.0.0/0", "::/0")]
|
||||
print(f" -> Berhasil: {len(routes)} rute lokal diunduh")
|
||||
return list(set(routes))
|
||||
else:
|
||||
print(" -> File kosong!")
|
||||
return []
|
||||
data = res.json()
|
||||
routes = [r.get("address") for r in data if r.get("address")]
|
||||
# Hapus default routes
|
||||
routes = [r for r in routes if r not in ("0.0.0.0/0", "::/0")]
|
||||
print(f" -> Berhasil: {len(routes)} rute lokal")
|
||||
return list(set(routes))
|
||||
else:
|
||||
print(f" -> Error download: {res.status_code} - {res.text[:100]}")
|
||||
print(f" -> Error: {res.status_code} - {res.text[:100]}")
|
||||
return []
|
||||
except Exception as e:
|
||||
print(f" -> Exception: {e}")
|
||||
print(f" -> Gagal: {e}")
|
||||
return []
|
||||
|
||||
def generate_address_list_script(route_list, list_name, filename):
|
||||
|
||||
Reference in New Issue
Block a user