#!/bin/bash
#[ "`echo "$@" |grep " --help"`" ] && date ;exit #{ HELP; exit ; }
#160219 ander
#180109 sfs
ping -c 2 -W 3 8.8.8.8 >/dev/null || exit 1
#sysdir=$(dirname $(realpath /mnt/live/porteus/modules))
value() { egrep -o "(^| )$1=[^ ]+" /proc/cmdline | cut -d= -f2; } ; export -f value
sysdir=$(dirname $(realpath "/mnt/home/`value dir`/modules"))
tmpdir="/tmp/mod_update" ; export tmpdir  # экспорт - для работы справки
blacklistfile="$sysdir"/modules/mod-up.blacklist  # если новый модуль присутствует в этом списке - будет игнорироваться

# splitname <разбираемое имя файла> <переменная под имя> <переменная под версию>
# пример: splitname $pfsname modname modver
splitname(){
  local ver sver
  ver=$(echo "$1" \
        |sed 's/i[3-6]86\|x86[_-]64\|x64\|[Xx][Ff][_-]\?86\|[Qq][Tt]4/masq/g
              s/_64/_masq/g' \
        |grep -oE '[_-]([A-Za-z]{0,2}[0-9][a-z0-9]*[_.+-])+')
  local re1='\(.*\)' re2='\1' n=1 partver
  for partver in $ver ; do
     n=$(($n+1))
     partver=${partver%?}
     partver=${partver#?}
     re1="${re1}$partver\\(.*\\)"
     re2="${re2}.*\\$n"
     sver="${sver}${sver:+-}$partver"
  done
  declare -g $2=$(echo "$1" |sed 's/'$re1'\.pfs/'$re2'\\.pfs/')
  declare -g $3=$sver
}

# newer <версия1> <версия2> - версия1 больше/новее версии2 ?
newer(){ [ "$1" != "$2" -a $(echo -e "$1\n$2"|sort -V|tail -1) == "$1" ] ; }

HELP(){
ntf -w "Поиск в репозитории обновленных версий подключенных модулей.pfs." \
"
Свежий модуль, по Вашему выбору, будет загружены в директорию с устаревшим модулем.
Устаревший модуль переименовывается в *.old.

Если эта директория недоступна для записи - загруженные свежие модули останутся в $tmpdir
Перенесите их вручную.

Чтобы изменения вступили в силу - перезагрузите систему.

Если Вы не хотите видеть предложение обновить именно на эту конкретную версию,\
 отметьте ее в колонке ЧС  для занесения в черный список (находится в modules/mod-up.blacklist).
 
 Ключи запуска:
 -b выполнить в фоне
 -f принудительно обновить список модулей" >/dev/null
}; export -f HELP

# START
unset background
[ "`echo "$@" |grep "\-b"`" ] && export background="yes"  # export - для getrepolist
[ "`echo "$@" |grep "\--help"`" ] && { HELP; exit ; }
[ "`echo "$@" |grep "\-f"`" ] && f="-f"

[ -d "$tmpdir" ] || mkdir -p -m 777 "$tmpdir"
cd "$tmpdir"
rm -f *.html newmodfound 2>/dev/null
[ "$(ls *.html newmodfound 2>/dev/null)" ] &&
         { echo "Не могу удалить временные файлы в $tmpdir"; exit 1; }

getrepolist $f || exit 1  # не удалось скачать список файлов в репозитории

unset newmod reportmess
num=0
cat $( ls -1 /sys/fs/aufs/*/br[0-9]* ) \
   | sed -n 's|^.*/\.\?\(.*\.pfs\)=r.*$|\1|p' \
   | sort \
   | while read pfsname ; do
        splitname $pfsname modname modver
        for similarpfs in $(grep "$modname" repolist.txt |grep -v "$pfsname" |cut -d' ' -f1); do
           splitname $(basename "$similarpfs") rname rver
           [ "$modname" == "$rname" ] \
           && newer "$rver" "$modver" \
           && ! grep -q "$(basename "$similarpfs")" "$blacklistfile" 2>/dev/null \
           && { modver="$rver"   # берем, если имя пакета то же, версия новее и данный файл не в ЧС
                newmod="$similarpfs"
                newmod_basename=$(basename "$newmod")
              }
        done
        [ "$newmod" ] && {
           # если модуль есть в нескольких репозиториях - возьмем из первого по списку
           newmod=$(grep -m 1 "$newmod_basename" repolist.txt |cut -d' ' -f1)
           # а размер возьмем тот, который не '?M'
           newmod_size=$(grep "$newmod_basename" repolist.txt |cut -d' ' -f3 \
                         |grep -v '\?M$'|head -n 1)
           [ "$newmod_size" ] || newmod_size="-"
           echo "false"
           echo "$pfsname"
           echo "$newmod_basename"
           echo "$newmod"
           echo "$newmod_size"
           echo "false"
           newmod=""
        }
        num=$(($num+1))
        echo "#Проверено $num" >&2
     done 2>&1 >newmodfound \
  |if [ ! "$background" ] ; then
      yad --progress --pulsate --center --image="gtk-refresh" \
          --no-buttons --text="<b>Идет поиск обновлений...</b>" \
          --auto-close --borders=15 --undecorated --skip-taskbar
   else
      # wt -start "Поиск обновленных модулей"
      cat >/dev/null
      # wt -kill
   fi
export dir="$(realpath "/mnt/home/`value dir`/")"
F(){ cat $(find  "$dir" -maxdepth 2 -type f -name mod-up.blacklist) |leafpad ;} ; export -f F
D(){ wt "sudo rm $(find  "$dir" -maxdepth 2 -type f -name mod-up.blacklist)"  ;} ; export -f D

if [ -s newmodfound ] ; then
        cat newmodfound | yad --title "Обновление модулей.pfs" \
                  --height=340 --width=660 --center \
                  --text "Выберите модули для обновления\nСтарые модули будут переименованы в *.old\nЧС - черный список" \
		  --window-icon="gtk-refresh" \
		  --image="gtk-refresh" --image-on-top \
                  --list --checklist \
                  --separator="\n" \
                  --column="V":CHK \
                  --column="Подключен" \
                  --column="В репозитории" \
                  --column="URL" \
                  --column="" \
                  --column="в ЧС":CHK \
                  --hide-column=4 \
                  --expand-column=3 \
                  --print-column=0 \
                  --print-all \
                  --button=gtk-help:"/bin/sh -c HELP" \
                  --button=ЧС!gtk-file!Просмотреть:"/bin/sh -c F" \
                  --button=ЧС!gtk-delete!Удвлить:"/bin/sh -c D" \
                  --button="Выполнить"\!gtk-refresh\!"Выбранные обновления будут загружены или модуль будет занесен в ЧС":0 \
                  --button=gtk-cancel:1 
	[ $? -ne 0 ] && touch /tmp/mod-up-err || sudo rm /tmp/mod-up-err ###sfs
else
    [ "$background" ] && n=i || n=w
    [ "$background" ] || ntf -$n "Поиск в репозитории обновленных"$'\n'"версий подключенных модулей.pfs." \
            "Обновлений не найдено" 
    exit 0
fi \
   | while read checked &&
           read oldmod &&
           read newmod &&
           read newmod_url &&
           read newmod_size &&
           read to_blacklist
           read null; do
       [ "$to_blacklist" == "TRUE" ] && echo "$newmod" >>"$blacklistfile" && continue
       [ "$checked" == "FALSE" ] && continue
       # может быть модуль уже загружен, но не подключен?
       foundinlocaldir=$(for i in $(find "$sysdir" -mindepth 2 -type f -name "$newmod")
                         do dirname $i; done)
       [ "$foundinlocaldir" ] &&
          { echo "$newmod уже находится в" $foundinlocaldir
            msg="Вы можете его подключить"
            for i in $foundinlocaldir; do
              echo "$i" | grep -qE '/base|/modules' \
              && { [ -e "$i/$oldmod" ] && mv "$i/$oldmod" "$i/${oldmod}.old"
                   msg="Перегрузите систему для подключения"
                 }
            done
            echo "$msg"
            continue
          }
       wget -c --progress=dot "${newmod_url}" 2>&1 \
       |sed -nu '/%/s/^.* \+\([0-9]\+%\).*$/\1/p;/%/s/^/#/p' \
       |yad --progress --title="Загрузка $newmod" \
            --height=50 --width=350 --center \
            --window-icon="gtk-refresh" --image="gtk-refresh" \
            --auto-close --auto-kill #--enable-log #--log-expanded
       wget_status="${PIPESTATUS[0]}"
       [ $wget_status -gt 0 ] &&
         { echo "Сбой загрузки. $newmod загрузить не удалось"
           rm $newmod 2>/dev/null
           continue; }
       datetime=$(date)
       copied=""
       for oldmod_fp in $(find "$sysdir" -mindepth 2 -type f -name "$oldmod")
       do oldmod_dir=$(dirname "$oldmod_fp")
                 warn=w
          cp "$newmod" "$oldmod_dir" &&
               { copied="yes"
                 echo "$newmod ==> $oldmod_dir"
                 echo "$datetime" >>"${oldmod_dir}/update.log"
                 echo "$newmod added" >>"${oldmod_dir}/update.log"
               } \
          && mv "$oldmod_fp" "${oldmod_fp}.old" &&
               { echo -e "${oldmod_dir}\n${oldmod} ==> ${oldmod}.old"
                 echo "${oldmod} ==> ${oldmod}.old" >>"${oldmod_dir}/update.log"
               } \
          ||   { echo "$newmod не удалось перенести в ${oldmod_dir}"
    		 warn=a 
               }    
       done
       [ "$copied" ] && rm "$newmod"
     done \
     | while read mess \
             || { rm -f newmodfound
                  files=$(ls -1 -I repolist.txt)
                      warn=w
                  [ "$files" ] &&
                    { reportmess="$reportmess\nОбновлены модули:\n$files\nПеренесите их вручную из $tmpdir"
                      reportmess="$reportmess\nМодули загружены, но не перенесены в директорию с файлами системы."
                      warn=a 
                    }
		    if [ ! -f /tmp/mod-up-err ];then ###sfs
                      #warn=w 
			[ "$reportmess" ] && 
                    	    m1="\nЧтобы изменения вступили в силу для автоматически загруженных модулей, перезагрузите систему." &&
                            m1="$m1\nЕсли обновился модуль, подключенный вручную, переподключите его." &&
			    ntf -$warn "Отчет обновления модулей.pfs" "$reportmess$m1" 
                    fi
                  false
                }
       do
         reportmess="${reportmess}${mess}\n"
       done