#!/bin/sh

PATH=/opt/bin:/opt/sbin:opt/usr/bin:opt/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin

# ####################################################################################################
# ЗАГРУЖАЕМ НАСТРОЙКИ
# ####################################################################################################

SCRIPT_DIR=$( dirname $0)
SCRIPT_NAME=$( basename $0)
SCRIPT_VER="0.7.1+"

CONFIG_NAME=""

# загружаем файл настроек
if [ -n "$1" ]; then
    # настройки заданы параметром
    if [ ! -e "$1" ]; then
	logger -t "$SCRIPT_NAME" "[ERROR] Can't load config file ($1)"
	echo "Can't load config file ($1)"
#!!!!!! EXIT
	exit 1
    else
	CONFIG_NAME="$1"
    fi
else
    # файл *.conf, находящийся в каталоге скрипта (хватаем первый попавшийся)
    cd "$SCRIPT_DIR"
    CONFIG_NAME=$( ls *.conf 2>/dev/null | head -1 )
    
    if [ -z "$CONFIG_NAME" ]; then
	CONFIG_NAME="/opt/etc/nod32upd.conf"
    else
	CONFIG_NAME="$SCRIPT_DIR/$CONFIG_NAME"
    fi
fi

. "$CONFIG_NAME"
[ $DEBUG_ON -eq 1 ] && echo "Use config =$CONFIG_NAME="

# ####################################################################################################
# ФУНКЦИИ
# ####################################################################################################

# $1 - код сообщения:
# log - записать $2 в лог файл ($2 -> log). $3 = "no_line" - нет переноса строки
# status - сведения о статусе. $2 - код статуса:
#	start - начало обновления. 
#	update
#	success - конец обновления (успешный). 
# error - ошибка. $2 - вид ошибки:
#	alert - предупреждение. (LONG_MSG->log-файл)
#	quit, fatal - записать сообщение и выйти. (LONG_MSG->log-файл, mail; SHORT_MSG->syslog,status; SEND_MSG->phone)


# LONG_MSG - пишется в log-файл (полное описание)
# SHORT_MSG - пишется в статус-файл + syslog, елси fatal (краткое описание)
# SEND_MSG - отправляется на телефон (очень краткое описание)
# на mail посылается STATUS_MSG + LOG_MSG
trace_msg() {

if [ "$1" = "log" ]; then
    if [ "$3" = "no_line" ]; then
	echo -n "$2" >> "$LOG_F"
    else
	echo "$2" >> "$LOG_F"
    fi
    return 0
fi

if [ "$1" = "status" ]; then
    MSG_DATE=`date +'%Y-%m-%d %T'`
    case "$2" in
	"start" )
	    echo "$MSG_DATE Start NOD32 Updating script. ver $SCRIPT_VER. PID: $$" > "$LOG_F"
	    logger -t "$SCRIPT_NAME" "Start NOD32 Updating script"
	    [ $DEBUG_ON -eq 1 ] && echo "Start NOD32 Updating script"
	    ;;
	"update")
	    echo "Updating..." > "$STATUS_F"
	    [ $DEBUG_ON -eq 1 ] && echo "Updating..."
	    ;;
	"success")
	    logger -t "$SCRIPT_NAME" "[info] Updating successfully completed ($LOG_VER)"
	    echo "NOD32 Updating script successfully completed ($LOG_VER)" >> "$LOG_F"
	    echo "Ok" > "$STATUS_F"
	    echo "[$MSG_DATE] Ok ($LOG_VER)" >> "$STATUS_MAIN_F"
	    [ $DEBUG_ON -eq 1 ] && echo "[info] successful update ($LOG_VER)"
	    ;;
    esac
    return 0
fi

if [ "$1" = "error" ]; then
    if [ "$2" = "quit" -o "$2" = "fatal" ]; then
	# выход после записи сообщения (НЕфатальная ошибка, база обновлений доступна)
	MSG_DATE=`date +'%Y-%m-%d %H:%M:%S'`
	
	# записать LONG_MSG в log
	echo "[error] $LONG_MSG" >> "$LOG_F"
	
	# записать в status
	if [ "$2" = "quit" ]; then
	    # записать в syslog
	    logger -t "$SCRIPT_NAME" "[error] $SHORT_MSG"
	    SHORT_MSG="Ok (error, $SHORT_MSG)"
	else
	    # fatal
	    # записать в syslog
	    logger -t "$SCRIPT_NAME" "[fatal error] $SHORT_MSG"
	    SHORT_MSG="ERROR ($SHORT_MSG)"
	fi
	echo "$SHORT_MSG" > "$STATUS_F"
	
	# отправить на телефон, письмо
	if [ -n "$NTEL" -a -n "$SEND_MSG" ]; then
#!!!!!!!!!!!!!! НЕ РАБОТАЕТ
	    echo "Sending error message to phone ($SEND_MSG)" >> "$LOG_F"
#	    /opt/etc/sendsms/sendtime.php 9 23 $NTEL $MSG_DATE, NOD32 updating: $SEND_MSG
	fi
	if [ -n "$MAIL" ]; then
#!!!!!!!!!!!!!! НЕ РАБОТАЕТ
	    echo "Sending error message to e-mail ($MAIL)" >> "$LOG_F"
#	    sendmail "$SHORT_MSG/r/n$LONG_MSG"
	fi
	
	echo "Abort" >> "$LOG_F"
	# записать в "общие журналы"
	echo "[$MSG_DATE] $SHORT_MSG" >> "$STATUS_MAIN_F"
	echo "--------------------------------------------------------------------" >> "$LOG_MAIN_F"
	echo "------- $MSG_DATE ----------------------------------------" >> "$LOG_MAIN_F"
	echo "--------------------------------------------------------------------" >> "$LOG_MAIN_F"
	cat "$LOG_F" >> "$LOG_MAIN_F"
	
	[ $DEBUG_ON -eq 1 ] && echo "$SHORT_MSG. $LONG_MSG"
	# выход
	clear_tmp
	pid_file 0
	exit 1
    # if [ "$2" = "quit" -o "$2" = "fatal" ]; then
    fi
    
    # продолжаем работу скрипта
    if [ "$2" = "alert" ]; then
	# записать LONG_MSG в log
	echo "[alert] $LONG_MSG" >> "$LOG_F"
    fi
fi
}

pid_file() {
# Наличие аргумента - просто удаляем файл-флаг
if [ -z "$1" ]; then
    if [ ! -f "$PID_F" ]; then
        echo $$ > "$PID_F"
    else
	# нефатальная ошибка (база остается доступной)
	LONG_MSG="Updating mirror NOD32 is running. Please, wait. If you are sure that process is not started remove $PID_F"
	SHORT_MSG="Updating mirror NOD32 is running. Please, wait"
	SEND_MSG=""
	[ $DEBUG_ON -eq 1 ] && echo "Updating mirror NOD32 is running. Please, wait. If you are sure that process is not started remove $PID_F"
        trace_msg error quit
    fi
else   # Аргумент присутствует - удалим файл-флаг
    rm -f "$PID_F"
fi
}

unpack_file() {
mv -f update.ver update.rar
unrar x -y -inul update.rar
if [ ! -f "update.ver" ]; then
    cp -f -p update.rar update.ver
fi
}

clear_tmp() {
trace_msg log "Clearing tmp"
if [ $DEBUG_ON -eq 0 ]; then
    cd "$TMP_BASE_DIR" 2>/dev/null
    rm -f update.rar
    rm -f update.old
    rm -f update.ver
    rm -f "$KEYS_HTML_F"
    rm -f "$KEYS_HTML_LOG_F"
    rm -r -f "$TMP_BASE_DIR"
fi
# Сделаем зеркало доступным для обновления
mv "$BASE_DIR/update.tmp" "$BASE_DIR/update.ver" 2>/dev/null
}

dl_file() {
# Arguments:
# 1 - If Errors - prepare to Abort? "1" - Yes, "0" - No
# 2 - File name to download
RETURN_CODE=0
CUR_COUNT_DL=0
until wget -U 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511' -nv -N -a "$LOG_F" --cache=off -t 2 --connect-timeout=5 --read-timeout=60 --http-user=$USER --password=$PASS "$2"; do
    # при загрузке произошла ошибка
    Auth=`sed '$!N;$!D' "$LOG_F" | grep 'Authorization failed'`
    if [ ${#Auth} != 0 ]; then
	# это ошибка авторизации
	if [ $USELEGAL = 1 ]; then
	    # у нас честный ключ, поэтому делаем паузу и пытаемся еще раз
	    if [ "$CUR_COUNT_DL" -lt "$AUTH_COUNT" ]; then
		# число попыток не превышено
		sleep $AUTH_PAUSE
		CUR_COUNT_DL=$((CUR_COUNT_DL+1))
		# пытаемся еще раз
		continue
	    fi
	else
	    dl_keys
	    load_username
	    sleep 2
	    
	    # пытаемся еще раз скачать
	    continue
	fi
    fi
    
    # не удается исправить ошибку - опускаем руки
    LONG_MSG="Error downloading file ($2)"
    SHORT_MSG="Can't download file (see log)"
    SEND_MSG="Can't download file"
    if [ "$1" = "1" ]; then
	mv "$BASE_DIR/update.tmp" "$BASE_DIR/update.tmp.old" 2>/dev/null
	rm -f "$BASE_DIR/update.new"
	trace_msg error fatal
    else
	trace_msg error alert
    fi
    RETURN_CODE=1
    break
done
return $RETURN_CODE
}

dl_keys() {
USER=''
PASS=''

LANG_OLD="$LANG"
# чтобы дата писалась на английском
LANG=en_EN.UTF-8
# TEMP_01 -> 2011/11/november-13-2011
TEMP_01=$( date  +'%Y\/%m\/%B-%d-%Y' | tr A-Z a-z )
LANG="$LANG_OLD"

until [ -z "$HTMLs_list" ] && [ -z "$keys" ]; do
# Циклим до тех пор пока не опустеет список и список ключей.
    if [ -z "$keys" ]; then
	# Скачаем страничку в случае пустой переменной со списком ключей
	# Берем первую ссылку.
	KEYS_HTML=$(echo "$HTMLs_list" | sed 's/,.*//' | sed "s/%TEMP_01%/$TEMP_01/" )
	# Удалим из списка проверяемую страницу
	HTMLs_list=$(echo "$HTMLs_list" | sed -n 's/[^,]*,//p')
	# Попытаемся загрузить страницу.
	trace_msg log  "Downloading list of keys $KEYS_HTML..." no_line
	wget -O "$KEYS_HTML_F" -o "$KEYS_HTML_LOG_F" -U 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511' $KEYS_HTML
	if [ $? != 0 ]; then
	    trace_msg log  "Error."
	    if [ -z "$HTMLs_list" ]; then
		# в случае ошибки и пустого списка страничек вываливаемся с фатальной ошибкой
		rm -f "$BASE_DIR/update.new"

		LONG_MSG="Error downloading list of keys"
		SHORT_MSG="Can't download list of keys"
		SEND_MSG="Can't download list of keys"
		trace_msg error fatal
	    else
		# Иначе пытаемся скачать следующую страничку
		continue
	    fi
	fi
	trace_msg log "Ok"
	# Вырежем ключи 
	keys=$(cat "$KEYS_HTML_F" | sed 's/<[^<>]*>/\n/g;s/ *//g' | sed -n 's/username:/&/Igp;s/password:/&/Igp')
	echo "$keys" > "$KEYS_F"
    fi
    
    trace_msg log "Get new username and password from list..." no_line
    until [ -z "$keys" ]; do
	# Берем первую пару username и password
	USER=$(echo "$keys"|sed '/^username:*/I!d; s///;q')
	PASS=$(echo "$keys"|sed '/^password:*/I!d; s///;q')

	# Удалим взятый логин и пароль из списка
	keys=$(echo "$keys"|sed '1,/^password:*/Id')

	if [ -z $USER ] || [ -z $PASS ]; then
	    # В случае отсутствия правильного юзера и пароля, пишем в лог ошибку и 
	    # пытаемся скачать новую страничку
	    break
	else
	    # в случае удачи сохраним новую пару в файле и выходим из обоих циклов принудительно
	    trace_msg log "Saving..." no_line
	    echo $USER | tr -d '\015' > "$KEY_F"
	    echo $PASS | tr -d '\015' >> "$KEY_F"
	    trace_msg log "Ok"
	    break 2
	fi
    done
    trace_msg log "Not Found"
done

if [ -z $USER ] || [ -z $PASS ]; then
    rm -f "$KEY_F"

    LONG_MSG="Corrected username and password not found"
    SHORT_MSG="Doesn't found user & pass"
    SEND_MSG="Doesn't found user & pass"
    trace_msg error fatal
fi
}

load_username() {
# Загрузим в переменные содержимое файла с логином и паролем
trace_msg log "Loading username & password from file"
USER=$(cat "$KEY_F" | sed -n '1,1p')
PASS=$(cat "$KEY_F" | sed -n '2,2p')
trace_msg log "Username: $USER"
trace_msg log "Password: $PASS"
}

# ####################################################################################################
# 
# ####################################################################################################
pid_file


# -------------------------------------------------------------------
# Проверка установок (доступность файлов, каталогов...) и их преобразование (языки, версии...)
# -------------------------------------------------------------------
# -----
# проверка существования каталогов + возможности записи в них
# попытка их создания в случае отсутствия
for T_DIR in `echo "BASE_DIR TMP_BASE_DIR PUBLIC_DIR PRIVATE_DIR"`; do
    eval PATH_DIR=\$$T_DIR
    
    if [ ! -d "$PATH_DIR" ]; then
	# каталог не существует, то пытаемся его создать
	ERR=$( mkdir -p "$PATH_DIR" 2>&1 )
	if [ $? -ne 0 ]; then
	    # неполучается создать каталог. ошибка
	    LONG_MSG="Directory $T_DIR don't exist. Can't create it ($ERR)"
	    SHORT_MSG="Invalid directory ($T_DIR)"
	    SEND_MSG=""
	    trace_msg error quit
	fi
    fi

#!!!!! НЕ ТЕСТИРОВАЛОСЬ
    # проверяем права на каталог (хотим rwx)
    if [ -r "$PATH_DIR" ]; then
	if [ -w "$PATH_DIR" ]; then
	    if [ -e "$PATH_DIR"  ]; then
		ERR=""
	    else
		ERR="execute"
	    fi
	else
	    ERR="write"
	fi
    else
	ERR="read"
    fi
    if [ ! -z "$ERR" ]; then
	LONG_MSG="Haven't permission to _$ERR_ to directory $T_DIR ($PATH_DIR). Need _full_ access permissions"
	SHORT_MSG="Invalid directory ($T_DIR)"
	SEND_MSG=""
	trace_msg error quit
    fi
done

# -----
# проверка существования файлов (или возможности их создания)
for T_FILE in `echo "KEY_F KEYS_F LOG_F STATUS_F PID_F KEYS_HTML_F KEYS_HTML_LOG_F ARCHIVE_F VERSION_F"`; do
    eval PATH_FILE=\$$T_FILE

    if [ -f "$PATH_FILE" ]; then
	# файл существует, проверяем права rw
#!!!!! НЕ ТЕСТИРОВАЛОСЬ
	if [ -r "$PATH_FILE" ]; then
	    if [ -w "$PATH_FILE" ]; then
		ERR=""
	    else
		ERR="write"
	    fi
	else
	    ERR="read"
	fi
	if [ ! -z "$ERR" ]; then
	    LONG_MSG="Haven't permission to _$ERR_ to file $T_FILE ($PATH_FILE). Need _rw_ access permissions"
	    SHORT_MSG="Invalid file ($T_FILE)"
	    SEND_MSG=""
	    trace_msg error quit
	fi
    else
	# файл не существует, проверяем возможность записи в родительский каталог
	DIR_NAME=$( dirname "$PATH_FILE" )
#!!!!! НЕ ТЕСТИРОВАЛОСЬ
	if [ ! -w "$DIR_NAME" ]; then
	    LONG_MSG="File $T_FILE don't exist and can't create it. Haven't permission to _write_ into directory $DIR_NAME (parent of file $T_FILE ($PATH_FILE)"
	    SHORT_MSG="Invalid file ($T_FILE)"
	    SEND_MSG=""
	    trace_msg error quit
	fi
    fi
done

# -------------------------------------------------------------------
# 
# -------------------------------------------------------------------
trace_msg status start

# -----
# составляем список кодов требуемых языков (LANGs -> LANG_CODE)
# разделитель полей - ","
IFS_PREV="$IFS"
IFS=","
LANG_CODE=$(
for language in `echo "$LANGs" | sed 's/^ *//'`; do
    # обрезаем начальные и конечные пробелы
    language=$( echo "$language" | sed 's/^ *//' | sed 's/ *$//' )
    case "$language" in
	"Bulgarian" ) echo "1026";;
	"Chinese Simplified" ) echo "2052";;
	"Chinese Traditional" ) echo "1028";;
	"Czech" ) echo "1029";;
	"Danish" ) echo "1030";;
	"Ge/bin/rman" ) echo "1031";;
	"English" ) echo "1033";;
	"Spanish" ) echo "3082";;
	"Finnish" ) echo "1035";;
	"French" ) echo "1036";;
	"Croatian" ) echo "1050";;
	"Hungarian" ) echo "1038";;
	"Italian" ) echo "1040";;
	"Dutch" ) echo "1043";;
	"Norwegian" ) echo "1044";;
	"Polish" ) echo "1045";;
	"Portuguese Brasil" ) echo "1046";;
	"Romanian" ) echo "1048";;
	"Russian" ) echo "1049";;
	"Slovak" ) echo "1051";;
	"Slovenian" ) echo "1060";;
	"Swedish" ) echo "1053";;
	"Turkish" ) echo "1055";;
	"Ukrainian" ) echo "1058";;

	* )
	    LONG_MSG="Invalid language in var LANGs ($language)"
	    SHORT_MSG="Invalid language (LANGs)"
	    SEND_MSG=""
	    echo "ERROR"
	    trace_msg error quit;;
    esac
done
)
IFS="$IFS_PREV"
CHECK=$( echo "$LANG_CODE" | grep "ERROR" )
[ -n "$CHECK"  ] && exit

# -----
# составляем список кодов требуемых платформ (PLATFORM -> PLATFORM_CODE)
# разделитель полей - ","
IFS_PREV="$IFS"
IFS=","
PLATFORM_CODE=$(
for cur_platform in `echo "$PLATFORM" | sed 's/^ *//'`; do
    # обрезаем начальные и конечные пробелы
    cur_platform=$( echo "$cur_platform" | sed 's/^ *//' | sed 's/ *$//' )
    case "$cur_platform" in
	"32") echo "x86
winnt32";;
	"64") echo "x64
winnt64";;
	* )
	    LONG_MSG="Invalid platform in var PLATFORM ($cur_platform)"
	    SHORT_MSG="Invalid platform (PLATFORM)"
	    SEND_MSG=""
	    echo "ERROR"
	    trace_msg error quit;;
    esac
done
)
IFS="$IFS_PREV"
CHECK=$( echo "$PLATFORM_CODE" | grep "ERROR" )
[ -n "$CHECK"  ] && exit

# -----
# составляем список кодов требуемых компонентов (COMPONENT -> COMPONENT_CODE)
# разделитель полей - ","
IFS_PREV="$IFS"
IFS=","
COMPONENT_CODE=$(
for cur_comp in `echo "$COMPONENT" | sed 's/^ *//'`; do
    # обрезаем начальные и конечные пробелы
    cur_comp=$( echo "$cur_comp" | sed 's/^ *//' | sed 's/ *$//' )
    case "$cur_comp" in
	"NOD32 Antivirus" ) echo "eav";;
	"NOD32 Antivirus BUSINESS EDITION" ) echo "eavbe";;
	"Smart Security" ) echo "ess";;
	"Smart Security BUSINESS EDITION" ) echo "essbe";;
	"Mail Security" ) echo "emsx";;
	* )
	    LONG_MSG="Invalid component in var COMPONENT ($cur_comp)"
	    SHORT_MSG="Invalid component (COMPONENT)"
	    SEND_MSG=""
	    echo "ERROR"
	    trace_msg error quit
    esac
done
)
IFS="$IFS_PREV"
CHECK=$( echo "$COMPONENT_CODE" | grep "ERROR" )
[ -n "$CHECK"  ] && exit

# -------------------------------------------------------------------
# Загружаем логин и пароль
# -------------------------------------------------------------------
if [ $USELEGAL -eq 0 ]; then
    # У нас нет честного пароля
    # Отсутствует файл с логином и паролем?
    # Скачаем новый логин-пароль и сохраним его в файл
    [ ! -f "$KEY_F" ] && dl_keys
    # Подгрузим логин и пароль из файла
    load_username
fi

# -------------------------------------------------------------------
# Скачиваем обновления (наконец-то...)
# -------------------------------------------------------------------
trace_msg status update

# запретим обновлятся через зеркало на момент обновления
mv "$BASE_DIR/update.ver" "$BASE_DIR/update.tmp" 2>/dev/null

cd "$TMP_BASE_DIR"
trace_msg log "Downloading update.ver"

dl_file 0 "$SERVER/eset_upd/update.ver"

if [ $? != 0 ]; then
# некритическая ошибка - зеркало оставить доступным и прервем загрузку
    mv "$BASE_DIR/update.tmp" "$BASE_DIR/update.ver" 2>/dev/null

    LONG_MSG="Can't download first update.ver ($SERVER/eset_upd/update.ver)"
    SHORT_MSG="Can't download first update.ver"
    SEND_MSG=""
    trace_msg error quit
fi

unpack_file
trace_msg log "Read list of Servers..."

# из списка:
# [HOSTS]^M
# Other=200@http://um10.eset.com/eset_upd/, 200@http://93.184.71.27/eset_upd/, 200@http://um12.eset.com/eset_u
# ^M
# 1051=200@http://um10.eset.com/eset_upd/sky/, 200@http://93.184.71.27/eset_upd/sky/, 200@http://um12.eset.com
# получаем (+ убираем первую строку):
# http://93.184.71.27/
# http://um12.eset.com/

SERVERS=`grep Other= update.ver|grep -v 'Telefonica-Other='|sed s/Other=//|tr -d "\r"|sed s/,/'\n'/g|sed s/^.*@//|sed s/^.*@//|sed s/'\/'eset_upd'\/'//|sed s/'\n'/' '/|sed 1d`

if [ $DEBUG_ON -eq 1 ]; then
    mv update.ver 00_update.ver 2>/dev/null
else
    rm -f update.ver
fi
rm -f update.rar
#!!!!!!!!!!!!!!!!!!!!!! удалить?!
mv "$BASE_DIR/update.tmp.old" "$BASE_DIR/update.tmp"  2>/dev/null

# очень корявый способ проверки того, что хотя бы один сервер проверялся на наличие обнолений
# нужен в случае если первый update.ver "пустой" (82 байта). т.к. у меня сейчас нет его примера, то не могу протестировать нормальный вариант
SERV_FLAG=""

# 1st - check new version on servers -------------------------------------------------------------------
for UPDSERVERS in $SERVERS; do
    SERV_FLAG="was"
    
    if [ -f "$BASE_DIR/update.tmp" ]; then
      cp -f -p "$BASE_DIR/update.tmp" "$TMP_BASE_DIR/update.old"
    fi
    trace_msg log "Checking $UPDSERVERS"

    if [ "$NOD_VER" = "3" ]; then
	dl_file 0 "$UPDSERVERS/eset_upd/update.ver"
    else
	dl_file 0 "$UPDSERVERS/eset_upd/v5/update.ver"
    fi

    if [ $? = 1 ]; then
      trace_msg log "Skipping $UPDSERVERS"
    else
      unpack_file
      if [ ! -e "update.old" ] || [ "update.ver" -nt "update.old" ]; then
        trace_msg log "Found new update.ver"
        
        PREV_IFS="$IFS"
        IFS=[
        trace_msg log "Parsing new update.ver"

# 2nd - parsing update.ver -----------------------------------------------------------------------------
	# удаляем: у первой стройки первый символ [, строки, которые начинаются с # или $
	# и разбиваем на элементы
	[ $DEBUG_ON -eq 1 ] && MYSERV="0"
	for section in `cat update.ver|sed '1s/\[//;s/^ *//'|grep -v '^#'|grep -v '^$'`; do
# ######################################################################################################
## отбрасываем всякий служебный мусор
if [ -z $(echo "$section" | sed 's/^PCUVER]/DELETE]/;s/^VER]/DELETE]/;s/^HOSTS]/DELETE]/;s/^Expire]/DELETE]/;s/^SETUP]/DELETE]/;s/^COMPATLIST]/DELETE]/;s/^data0001]/DELETE]/' | grep '^DELETE]') ]; then
    # файлы обновлений для уменьшения трафика
    UPD_TRAFFIC=$(echo "$section" | sed 's/^CONTINUOUS_.*]/DELETE]/;s/^REVERSE_.*]/DELETE]/;s/^PRELIMINARY_.*]/DELETE]/' | grep '^DELETE]')
    if [ -n "$UPD_TRAFFIC" -a "$TRAFFIC" -eq 0 ]; then
	# данный файл для уменьшения траффика, а у нас стоит запрет на его загрузку => пропускаем
	myTMP=""
    else
	sect=$(echo $section | tr -d "\r" )
    
	# выясняем платформу (если платформа не указана, значит неважно, и тогда grep "" выведет все строки
	UPD_PLATFORM=$( echo "$sect" | grep "platform=" | sed 's/^platform=//' )
	if [ $( echo "$PLATFORM_CODE" | grep "$UPD_PLATFORM" | wc -l ) -ne 0 ]; then
	    # выясняем компонент
	    UPD_COMPONENT=$( echo "$sect" | grep "type=" | sed 's/^type=//' )
	    # присутствует ли строка display_name ?
	    UPD_DNAME=$( echo "$sect" | grep "display_name" )
	    ALLOW=1
	    [ -n "$UPD_DNAME" ] && ALLOW=$( echo "$COMPONENT_CODE" | grep "$UPD_COMPONENT" | wc -l )
	    if [ $ALLOW  -ne 0 ]; then
		# выясняем язык
		UPD_LANG=$( echo "$sect" | grep "language=" | sed 's/^language=//' )
		if [ $( echo "$LANG_CODE" | grep "$UPD_LANG" | wc -l ) -ne 0 ]; then
		    # все проверки пройдены, начинаем загрузку файла обновления
		    UPD_FILE=$( echo "$sect" | grep "file=" | sed s/^file='\/'// )
            	    
            	    # set version 
            	    UPD_ENGINE=$(echo $sect|grep '^ENGINE')
		    [ ! -z "$UPD_ENGINE" ] && UPD_VERSION=$(echo $sect | sed '/^version=*/!d; s///;q'|tr -d '\015')
                
		    cd "$BASE_DIR"
		    trace_msg log "Checking file: $UPDSERVERS/$UPD_FILE"
		    
		    [ $DEBUG_ON -eq 1 ] && MYSERV=$((MYSERV+1))
		    [ $DEBUG_ON -eq 1 ] && echo $MYSERV
		    
		    dl_file 1 "$UPDSERVERS/$UPD_FILE"
		    cd "$TMP_BASE_DIR"
		    echo "[$(echo $section | sed 's/file=.*\//file=/')" >> "$BASE_DIR"/update.new
		fi
	    fi
	fi
    fi
fi
# ######################################################################################################
	# for section in `cat update.ver|sed '1s/\[//;s/^ *//'|grep -v '^#'|grep -v '^$'`; do
	done
# 2nd ----------------------------------------------------------------------------------------------------
        IFS=' '
        # .new file to .ver & set new file date
        cd "$BASE_DIR"
        if [ -f "update.new" ]; then
          mv -f update.new update.tmp
          touch -am -r "$TMP_BASE_DIR/update.ver" update.tmp
	  trace_msg log "Sucessfully downloads new updates"
        fi
        cd "$TMP_BASE_DIR"
        IFS="$IFS_PREV"
        
#     if [ ! -e "update.old" ] || [ "update.ver" -nt "update.old" ]; then
      fi
#   if [ $? = 1 ]; then
    fi # Skipping server
done
# 1st -----------------------------------------------------------------------------------------------------

if [ -z "$SERV_FLAG" ]; then
    # переменная $SERVERS была пустая и мы не проверили ни одного сервера
    # нефатальная ошибка (база остается доступной)
    LONG_MSG="First downloaded -update.ver- is empty"
    SHORT_MSG="update.ver is empty"
    SEND_MSG=""
    [ $DEBUG_ON -eq 1 ] && echo "First downloaded -update.ver- is empty"
    trace_msg error quit
fi

clear_tmp

# Сделаем зеркало доступным для обновления
mv "$BASE_DIR/update.tmp" "$BASE_DIR/update.ver" 2>/dev/null

# прописываем номер версии
if [ -n "$UPD_VERSION" ]; then
    # база обновлений была измененена

    trace_msg log "Base version: $UPD_VERSION"
    echo "$UPD_VERSION" > "$VERSION_F"
    LOG_VER="ver: $UPD_VERSION"
    
    if [ $ARCHIVE -eq 1 ]; then
	trace_msg log "Create packed Base..."
	[ $DEBUG_ON -eq 1 ] && echo "Create packed Base..."
	cd "$BASE_DIR"
	tar cf "$ARCHIVE_F" *
    fi
else
    LOG_VER="no updates"
fi

trace_msg status success
pid_file 0
exit 0
