1
0

functions.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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"
  73. mkdir -p "$WINBOX_DIR"
  74. LINKS=$($WGET $WGET_OPTS https://mikrotik.com/download -O - | grep -oP 'https?://[^"]*winbox[^"]*\.(exe|zip)' || echo "")
  75. if [ -z "$LINKS" ]; then
  76. log_error "No winbox links found"
  77. return 1
  78. fi
  79. for LINK in $LINKS; do
  80. if [[ "$LINK" == ${WINBOX_BASE_URL}/* ]]; then
  81. RELATIVE_PATH="${WINBOX_DIR}/${LINK#${WINBOX_BASE_URL}/}"
  82. mkdir -p "$(dirname "$RELATIVE_PATH")"
  83. if [ -f "$RELATIVE_PATH" ]; then
  84. log "File already exists: $RELATIVE_PATH"
  85. continue
  86. fi
  87. log "Downloading: $LINK"
  88. if curl -s -L -o "$RELATIVE_PATH" "$LINK"; then
  89. FILE_SIZE=$(du -h "$RELATIVE_PATH" | cut -f1)
  90. log_success "Downloaded: $RELATIVE_PATH ($FILE_SIZE)"
  91. else
  92. log_error "Failed to download: $LINK"
  93. rm -f "$RELATIVE_PATH"
  94. fi
  95. else
  96. log "Skipping external link: $LINK"
  97. fi
  98. done
  99. }