|
| 1 | +# CloudFlare IP Address List Updater (IPv4 only) |
| 2 | +# Работает на RouterOS 6.x и 7.x |
| 3 | +# Скачивает и обновляет список IPv4-адресов CloudFlare |
| 4 | +# |
| 5 | +# Установка: |
| 6 | +# /system script add name=cloudflare-ip-updater source={ ... код ... } |
| 7 | +# /system script run cloudflare-ip-updater |
| 8 | +# |
| 9 | +# Автозапуск: |
| 10 | +# /system scheduler add name=cloudflare-update interval=7d on-event=cloudflare-ip-updater start-time=03:31:00 |
| 11 | + |
| 12 | +:local url "https://www.cloudflare.com/ips-v4/#" |
| 13 | +:local listName "CF" |
| 14 | +:local tempFile "cloudflare-ips.txt" |
| 15 | + |
| 16 | +# --- 1. Удаляем старый файл --- |
| 17 | +:do { |
| 18 | + /file remove $tempFile |
| 19 | + :delay 1s |
| 20 | +} on-error={} |
| 21 | + |
| 22 | +:log info "CloudFlare IP updater: Downloading $url..." |
| 23 | + |
| 24 | +# --- 2. Скачиваем файл --- |
| 25 | +:do { |
| 26 | + /tool fetch url=$url dst-path=$tempFile |
| 27 | +} on-error={ |
| 28 | + :log error "CloudFlare IP updater: Fetch command failed" |
| 29 | + :error "Fetch failed" |
| 30 | +} |
| 31 | + |
| 32 | +# --- 3. Ждём завершения загрузки --- |
| 33 | +:local maxWait 30 |
| 34 | +:local waited 0 |
| 35 | +:while ([:len [/file find name=$tempFile]] = 0 && $waited < $maxWait) do={ |
| 36 | + :delay 1s |
| 37 | + :set waited ($waited + 1) |
| 38 | +} |
| 39 | + |
| 40 | +:if ($waited >= $maxWait) do={ |
| 41 | + :log error "CloudFlare IP updater: Download timeout" |
| 42 | + :error "Download timeout" |
| 43 | +} |
| 44 | + |
| 45 | +:delay 2s |
| 46 | + |
| 47 | +# --- 4. Проверка файла --- |
| 48 | +:if ([:len [/file find name=$tempFile]] = 0) do={ |
| 49 | + :log error "CloudFlare IP updater: File not found after download" |
| 50 | + :error "Download failed" |
| 51 | +} |
| 52 | + |
| 53 | +:local fileSize [/file get $tempFile size] |
| 54 | +:if ($fileSize = 0) do={ |
| 55 | + :log error "CloudFlare IP updater: Downloaded file is empty" |
| 56 | + /file remove $tempFile |
| 57 | + :error "Empty file" |
| 58 | +} |
| 59 | + |
| 60 | +:log info "CloudFlare IP updater: File downloaded successfully ($fileSize bytes)" |
| 61 | + |
| 62 | +# --- 5. Очищаем старые записи --- |
| 63 | +:local oldCount [:len [/ip firewall address-list find list=$listName]] |
| 64 | +:if ($oldCount > 0) do={ |
| 65 | + /ip firewall address-list remove [find list=$listName] |
| 66 | + :log info "cloudflare IP updater: Removed $oldCount old entries from '$listName'" |
| 67 | +} |
| 68 | + |
| 69 | +# --- 6. Читаем файл и добавляем новые записи --- |
| 70 | +:local content [/file get $tempFile contents] |
| 71 | +:local start 0 |
| 72 | +:local len [:len $content] |
| 73 | +:local count 0 |
| 74 | +:local skipped 0 |
| 75 | + |
| 76 | +:while ($start < $len) do={ |
| 77 | + :local pos [:find $content "\n" $start] |
| 78 | + :if ([:typeof $pos] = "nil") do={ |
| 79 | + :set pos $len |
| 80 | + } |
| 81 | + |
| 82 | + :local line [:pick $content $start $pos] |
| 83 | + |
| 84 | + # Убираем \r |
| 85 | + :local crPos [:find $line "\r"] |
| 86 | + :if ([:typeof $crPos] != "nil") do={ |
| 87 | + :set line [:pick $line 0 $crPos] |
| 88 | + } |
| 89 | + |
| 90 | + # Убираем пробелы в начале |
| 91 | + :while ([:len $line] > 0 && [:pick $line 0 1] = " ") do={ |
| 92 | + :set line [:pick $line 1 [:len $line]] |
| 93 | + } |
| 94 | + |
| 95 | + # Убираем пробелы в конце |
| 96 | + :while ([:len $line] > 0 && [:pick $line ([:len $line] - 1)] = " ") do={ |
| 97 | + :set line [:pick $line 0 ([:len $line] - 1)] |
| 98 | + } |
| 99 | + |
| 100 | + # Пропускаем пустые строки и комментарии |
| 101 | + :if ([:len $line] > 0 && [:pick $line 0 1] != "#") do={ |
| 102 | + # Простая проверка: если есть двоеточие - это IPv6, пропускаем |
| 103 | + :local colonPos [:find $line ":"] |
| 104 | + |
| 105 | + :if ([:typeof $colonPos] = "nil") do={ |
| 106 | + # Нет двоеточия - пробуем добавить как IPv4 |
| 107 | + :do { |
| 108 | + /ip firewall address-list add list=$listName address=$line comment="cloudflare IPv4" |
| 109 | + :set count ($count + 1) |
| 110 | + } on-error={ |
| 111 | + :set skipped ($skipped + 1) |
| 112 | + :log warning "cloudflare IP updater: Skipped invalid IPv4 line: '$line'" |
| 113 | + } |
| 114 | + } else={ |
| 115 | + :set skipped ($skipped + 1) |
| 116 | + } |
| 117 | + } |
| 118 | + :set start ($pos + 1) |
| 119 | +} |
| 120 | + |
| 121 | +# --- 7. Убираем временный файл --- |
| 122 | +/file remove $tempFile |
| 123 | + |
| 124 | +# --- 8. Финальный лог --- |
| 125 | +:if ($count > 0) do={ |
| 126 | + :log info "cloudflare IP updater: Successfully added $count IPv4 entries to address list '$listName' (skipped $skipped IPv6 entries)" |
| 127 | +} else={ |
| 128 | + :log warning "cloudflare IP updater: No valid IPv4 entries found! (skipped $skipped entries)" |
| 129 | +} |
0 commit comments