functions.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #!/bin/bash
  2. # Функции логирования
  3. log() {
  4. if [ "${LOG_OFF}" = "1" ]; then
  5. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1".
  6. else
  7. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
  8. fi
  9. }
  10. log_error() {
  11. if [ "${LOG_OFF}" = "1" ]; then
  12. echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2
  13. else
  14. echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" | tee -a "$LOG_FILE" >&2
  15. fi
  16. }
  17. log_success() {
  18. if [ "${LOG_OFF}" = "1" ]; then
  19. echo "[$(date '+%Y-%m-%d %H:%M:%S')] SUCCESS: $1"
  20. else
  21. echo "[$(date '+%Y-%m-%d %H:%M:%S')] SUCCESS: $1" | tee -a "$LOG_FILE"
  22. fi
  23. }
  24. # Функция проверки ошибок
  25. check_error() {
  26. local ret=$1
  27. local message=$2
  28. if [ $ret -ne 0 ]; then
  29. log_error "$message"
  30. return 1
  31. fi
  32. return 0
  33. }
  34. # Функция загрузки дополнительных файлов
  35. download_additional_files() {
  36. local version=$1
  37. local user_agent=${2:-""}
  38. for file in "${additional_files[@]}"; do
  39. file=$(echo ${file} | sed "s/VERSION/${version}/")
  40. if [ -n "$user_agent" ]; then
  41. $WGET $WGET_OPTS -U "$user_agent" "http://upgrade.mikrotik.com/routeros/${version}/${file}" || \
  42. log "Warning: Failed to download ${file}"
  43. else
  44. $WGET $WGET_OPTS "http://upgrade.mikrotik.com/routeros/${version}/${file}" || \
  45. log "Warning: Failed to download ${file}"
  46. fi
  47. done
  48. }
  49. # Функция для преобразования версии в числовой формат
  50. version_to_number() {
  51. local version=$1
  52. local major=$(echo $version | cut -d. -f1)
  53. local minor=$(echo $version | cut -d. -f2)
  54. local patch=$(echo $version | cut -d. -f3)
  55. echo $((major * 1000000 + minor * 1000 + patch))
  56. }
  57. # Функция для определения типа версии и нужного user agent
  58. get_ros7_user_agent() {
  59. local version=$1
  60. local version_num=$(version_to_number "$version")
  61. local threshold_num=$(version_to_number "7.12.1")
  62. if [ $version_num -ge $threshold_num ]; then
  63. # Версия равна или выше 7.12.1
  64. echo "after"
  65. else
  66. # Версия ниже 7.12.1
  67. echo "before"
  68. fi
  69. }
  70. # Функция загрузки Winbox с сохранением по версиям
  71. download_winbox() {
  72. log "Downloading Winbox files from mikrotik.com"
  73. mkdir -p "$WINBOX_DIR"
  74. # Получаем HTML-контент страницы
  75. PAGE_CONTENT=$(curl -s "https://mikrotik.com/download/winbox")
  76. # Ищем все ссылки на .zip, .dmg и .sha256 файлы
  77. LINKS=$(echo "$PAGE_CONTENT" | grep -oP 'href="https?://[^"]*\.(zip|dmg|sha256)"' | sed 's/href="//;s/"//')
  78. # Альтернативный вариант: ищем все ссылки, содержащие download.mikrotik.com и winbox
  79. if [ -z "$LINKS" ]; then
  80. LINKS=$(echo "$PAGE_CONTENT" | grep -oP 'https?://download\.mikrotik\.com[^"]*winbox[^"]*\.(zip|dmg|sha256)"' | sed 's/"//')
  81. fi
  82. if [ -z "$LINKS" ]; then
  83. log_error "No winbox links found (.zip, .dmg or .sha256)"
  84. return 1
  85. fi
  86. # Удаляем дубликаты ссылок
  87. LINKS=$(echo "$LINKS" | sort -u)
  88. log "Found $(echo "$LINKS" | wc -l) unique links"
  89. for LINK in $LINKS; do
  90. # Извлекаем версию из URL (часть после /winbox/)
  91. if [[ "$LINK" =~ /routeros/winbox/([^/]+)/ ]]; then
  92. VERSION="${BASH_REMATCH[1]}"
  93. # Создаем путь для сохранения с учетом версии
  94. VERSION_DIR="$WINBOX_DIR/$VERSION"
  95. else
  96. VERSION_DIR="$WINBOX_DIR"
  97. fi
  98. # Извлекаем имя файла из URL
  99. FILENAME=$(basename "$LINK")
  100. # Полный путь для сохранения
  101. FILE_PATH="$VERSION_DIR/$FILENAME"
  102. # Создаем каталог для версии
  103. mkdir -p "$VERSION_DIR"
  104. # Проверяем, существует ли файл уже
  105. if [ -f "$FILE_PATH" ]; then
  106. log "File already exists: $FILE_PATH"
  107. continue
  108. fi
  109. log "Downloading: $LINK"
  110. # Скачиваем файл с обработкой ошибок
  111. if curl -s -L -o "$FILE_PATH" "$LINK"; then
  112. # Проверяем, что файл не пустой
  113. if [ -s "$FILE_PATH" ]; then
  114. FILE_SIZE=$(du -h "$FILE_PATH" | cut -f1)
  115. log_success "Downloaded: $FILE_PATH ($FILE_SIZE)"
  116. else
  117. log_error "Downloaded empty file: $LINK"
  118. rm -f "$FILE_PATH"
  119. fi
  120. else
  121. log_error "Failed to download: $LINK"
  122. rm -f "$FILE_PATH"
  123. fi
  124. # Небольшая пауза между загрузками
  125. sleep 0.5
  126. done
  127. }