diff --git a/bgp_export_script.rsc b/bgp_export_script.rsc index f9457a3..039637b 100644 --- a/bgp_export_script.rsc +++ b/bgp_export_script.rsc @@ -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"; \ } diff --git a/sync_routing.py b/sync_routing.py index 1193638..e44c69c 100644 --- a/sync_routing.py +++ b/sync_routing.py @@ -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):