#!/bin/bash
#160224 ander
#180118 sfs

repolist="/etc/sfs-get/www.list"        # список url репозиториев
[ "$etime" ]  || etime=18000   # (5 часов) repolist.txt expire time. если свежее - не перекачивается
[ "$tmpdir" ] || tmpdir="/tmp/mod_update"
[ -d "$tmpdir" ] || mkdir -p -m 777 "$tmpdir"
cd "$tmpdir"

echo $@ |grep -Eq '(^|[[:space:]])(-h|--help)([[:space:]]|$)' && {
  echo "
  $0 [keys] - обновляет repolist.txt - список файлов в репозиториях
  Список репозиториев берется из /etc/sfs-get/www.list
  repolist.txt обновляется, если он отсутствует, или если с момента
  его создания прошло более etime секунд.  etime может быть установлено
  как переменная окружения, по умолчанию 18000 секунд
  Расположение repolist.txt задается переменной окружения
  tmpdir, по умолчанию /tmp/mod_update
  Ключи командной строки:
  -b - отработь в фоне, без сообщений. Также может быть задано установкой
       переменной окружения background=yes
  -e [time] - установить время, через которое repolist.txt считается устаревшим,
        в time секунд.  -e без параметра эквивалентно -e 0
  -f - эквивалентно -e 0"
  exit
}
# разбор ключей ком.строки
while getopts ":be:f" opt; do
  case "$opt" in
    "b") background="yes" ;;
    "e") etime="$OPTARG" ;;
    "f") etime=0 ;;
    ":") [ "$OPTARG" == "e" ] && etime=0 ;;
  esac
done

# На всякий случай, чтобы лишних файлов не оставлял
trap 'rm -f repolist.txt.new index.html' TERM

[ -e repolist.txt.new ] \
 && if [ $(( $(date "+%s") - $(date -r repolist.txt.new "+%s") )) -lt 120 ]
    then # похоже, уже выполняется, подождем
	while [ -e repolist.txt.new ] &&
	      [ $(( $(date "+%s") - $(date -r repolist.txt.new "+%s") )) -lt 120 ]
	do sleep 5; done
	[ -e repolist.txt.new ] &&
	  { echo "Проблемы с обновлением списка файлов в репозитории"
	    echo "Нет связи?"
	    exit 1
	  }
    else # файл уже старый, скорее всего от зависшего процесса
	rm -f repolist.txt.new 2>/dev/null ||
	  { echo "Не могу удалить старый $tmpdir/repolist.txt.new"; exit 1; }
    fi

[ -s repolist.txt ] \
&& [ $(( $(date "+%s") - $(date -r repolist.txt "+%s") )) -lt $etime ] \
&& exit 0   # список не пустой и не устарел - перекачивать не нужно

W(){
for repo in $(sed '/^[[:space:]]*#/d;/^[[:space:]]*$/d' "$repolist"); do
    wget -O index.html "$repo" 2>&1
    sed -n 's|%\([[:xdigit:]]\{2\}\)|\\\\x\1|g
            s|</li>|0 0 ?M|
            s|.*href="\(.*\.pfs\)".*</a> *\([^ ]*\) *[^ ]* *\([^ ]*\)$|'$repo'/\1 \2 \3|p' index.html \
      | while read string ; do
          echo -e "$string"  # '%2b' -> "sed" -> '\x2b' -> "echo -e" -> '+'
        done >>repolist.txt.new
    rm index.html
done \
|if [ ! "$background" ] ; then
     sed -u 's/^/#/' \
     | yad --progress --pulsate \
	   --window-icon="gtk-refresh" \
           --title="Загрузка списка файлов репозиториев" \
           --height=300 --width=600 --center \
           --auto-close --auto-kill --enable-log --log-expanded
 else
     # wt -start "Загрузка списков репозиториев"
     cat >/dev/null
     # wt -kill
 fi
}
C(){
[ "$background" ] || wt -start "Загрузка списка файлов репозиториев" &
for repo in $(sed '/^[[:space:]]*#/d;/^[[:space:]]*$/d' "$repolist"); do
    repo="`echo "$repo" |sed 's#^mirror.#ftp://ftp.#'`"
    curl  -w -l "$repo/" \
	|awk '{print "'$repo'/"$9" "$7"-"$6"-"$8" "int(($5/1024/1024)*100)/100"M"}' \
        |head -n-1 >>repolist.txt.new
done
[ "$background" ] || wt -kill
}
C

[ -s repolist.txt.new ] && mv -f repolist.txt.new repolist.txt
sed -i 's/\r//' repolist.txt
# если все нормально - выход будет нулевой
# а ненулевой - значит, обновить не удалось