| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #!/bin/bash
- # Функции логирования
- log() {
- if [ "${LOG_OFF}" = "1" ]; then
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1".
- else
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
- fi
- }
- log_error() {
- if [ "${LOG_OFF}" = "1" ]; then
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2
- else
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" | tee -a "$LOG_FILE" >&2
- fi
- }
- log_success() {
- if [ "${LOG_OFF}" = "1" ]; then
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] SUCCESS: $1"
- else
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] SUCCESS: $1" | tee -a "$LOG_FILE"
- fi
- }
- # Функция проверки ошибок
- check_error() {
- local ret=$1
- local message=$2
- if [ $ret -ne 0 ]; then
- log_error "$message"
- return 1
- fi
- return 0
- }
- # Функция загрузки дополнительных файлов
- download_additional_files() {
- local version=$1
- local user_agent=${2:-""}
-
- for file in "${additional_files[@]}"; do
- file=$(echo ${file} | sed "s/VERSION/${version}/")
- if [ -n "$user_agent" ]; then
- $WGET $WGET_OPTS -U "$user_agent" "http://upgrade.mikrotik.com/routeros/${version}/${file}" || \
- log "Warning: Failed to download ${file}"
- else
- $WGET $WGET_OPTS "http://upgrade.mikrotik.com/routeros/${version}/${file}" || \
- log "Warning: Failed to download ${file}"
- fi
- done
- }
- # Функция для преобразования версии в числовой формат
- version_to_number() {
- local version=$1
- local major=$(echo $version | cut -d. -f1)
- local minor=$(echo $version | cut -d. -f2)
- local patch=$(echo $version | cut -d. -f3)
- echo $((major * 1000000 + minor * 1000 + patch))
- }
- # Функция для определения типа версии и нужного user agent
- get_ros7_user_agent() {
- local version=$1
- local version_num=$(version_to_number "$version")
- local threshold_num=$(version_to_number "7.12.1")
-
- if [ $version_num -ge $threshold_num ]; then
- # Версия равна или выше 7.12.1
- echo "after"
- else
- # Версия ниже 7.12.1
- echo "before"
- fi
- }
- # Функция загрузки Winbox с сохранением по версиям
- download_winbox() {
- log "Downloading Winbox files from mikrotik.com"
-
- mkdir -p "$WINBOX_DIR"
-
- # Получаем HTML-контент страницы
- PAGE_CONTENT=$(curl -s "https://mikrotik.com/download/winbox")
-
- # Ищем все ссылки на .zip, .dmg и .sha256 файлы
- LINKS=$(echo "$PAGE_CONTENT" | grep -oP 'href="https?://[^"]*\.(zip|dmg|sha256)"' | sed 's/href="//;s/"//')
-
- # Альтернативный вариант: ищем все ссылки, содержащие download.mikrotik.com и winbox
- if [ -z "$LINKS" ]; then
- LINKS=$(echo "$PAGE_CONTENT" | grep -oP 'https?://download\.mikrotik\.com[^"]*winbox[^"]*\.(zip|dmg|sha256)"' | sed 's/"//')
- fi
-
- if [ -z "$LINKS" ]; then
- log_error "No winbox links found (.zip, .dmg or .sha256)"
- return 1
- fi
-
- # Удаляем дубликаты ссылок
- LINKS=$(echo "$LINKS" | sort -u)
-
- log "Found $(echo "$LINKS" | wc -l) unique links"
-
- for LINK in $LINKS; do
- # Извлекаем версию из URL (часть после /winbox/)
- if [[ "$LINK" =~ /routeros/winbox/([^/]+)/ ]]; then
- VERSION="${BASH_REMATCH[1]}"
- # Создаем путь для сохранения с учетом версии
- VERSION_DIR="$WINBOX_DIR/$VERSION"
- else
- VERSION_DIR="$WINBOX_DIR"
- fi
-
- # Извлекаем имя файла из URL
- FILENAME=$(basename "$LINK")
-
- # Полный путь для сохранения
- FILE_PATH="$VERSION_DIR/$FILENAME"
-
- # Создаем каталог для версии
- mkdir -p "$VERSION_DIR"
-
- # Проверяем, существует ли файл уже
- if [ -f "$FILE_PATH" ]; then
- log "File already exists: $FILE_PATH"
- continue
- fi
-
- log "Downloading: $LINK"
-
- # Скачиваем файл с обработкой ошибок
- if curl -s -L -o "$FILE_PATH" "$LINK"; then
- # Проверяем, что файл не пустой
- if [ -s "$FILE_PATH" ]; then
- FILE_SIZE=$(du -h "$FILE_PATH" | cut -f1)
- log_success "Downloaded: $FILE_PATH ($FILE_SIZE)"
- else
- log_error "Downloaded empty file: $LINK"
- rm -f "$FILE_PATH"
- fi
- else
- log_error "Failed to download: $LINK"
- rm -f "$FILE_PATH"
- fi
-
- # Небольшая пауза между загрузками
- sleep 0.5
- done
- }
|