#!/bin/bash
#240223 sfs
yad --version |grep -E '^0' && export gtk=gtk || export gtk=yad
#export MLOAD=open_pfs
export MLOAD=pfsload
export MUNLOAD=pfsunload
export loaddir="/mnt/home/`egrep -o "(^| )dir=[^ ]+" /proc/cmdline | cut -d= -f2`/optional"
export rep="\
#api.github.com/repos/sfs-pra/portable/releases/tags/portable64-23
api.github.com/repos/sfs-pra/portable/releases/tags/portable64
mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable
"
[ -s /etc/mmod.conf ] && . /etc/mmod.conf

if [ -z `which gksu` ]; then
[ "`whoami`" != "root" ] && exec gksu ${0} "$@"
else
[ "`whoami`" != "root" ] && exec xterm -e "exec sudo  ${0} "$@""
fi

export msg_title="Менеджер модулей" 
yad_deco="--regex-search --search-column=1 --center --separator= "
list=/var/lib/`basename $0`/`basename "$0"`

NTF(){
    [ "$1" = "-i" ] && { notify-send -a mmod -i $2 "`printf "$3\n$4"`" ; return ; }
    i="--image=gtk-info --button=$gtk-ok:0 --back=red" && col=green
    [ "$1" = "-q" ] && i="--image=gtk-dialog-question --button=$gtk-yes:0 --button=$gtk-no" && col=black
    [ "$1" = "-a" ] && i="--image=gtk-dialog-error --button=$gtk-ok:0" && col=red
    tit="`echo $2 | sed 's/<[^>]*>//g'`"
    yad --width=600 --form  \
    --image-on-top $i  --mouse \
    --window-icon=gtk-info --title="$tit" \
    --text "<span color=\"$col\"><b>$2</b></span>\n<i>$3</i>"  >/dev/null && echo $? 
}
export -f NTF

KILL(){ pkill -f "yad --title=$msg_title" ;}
export -f KILL

getlist(){
    mkdir -p `dirname $list` &&  rm $list 2>/dev/null
  for r in `echo "$rep" |grep -vE "^#" ` ;do
    HTTP(){
    wget "$r" -O - |\
    awk -F'"' '/^<a / {print $2" "$3}' |awk '{print "https://'$r'/"$1" "$3" "$5}' >> $list
    }
    GIT(){
    wget "$r" -O - |awk -F\" '/browser_download_url/ {print $4}' >> $list 
#    wt "wget "$r" -O - |awk -F\" '/browser_download_url/ {print $4}' >> $list"
#    curl -s "$1" | jq -r '.assets[].browser_download_url' >> $list
    }
    echo "$r" |grep api.github.com  && GIT || HTTP
    if [ ! -s "$list" ] ;then
	NTF -a "Ошибка загрузки" "$r" ; KILL ; exit 1 
    else NTF -i gtk-ok "Репозиторий обновлен" "$r"
    fi
  done
}

DLOAD(){ 
    ! unsquashfs -s "$1/$2" >/dev/null && 
	NTF -a "$1/$2 " "не squashfs модуль" && return
    [ "`losetup  -O BACK-FILE |tail -n+2 |sed 's,^.*/,,' |grep "$2" `" ] && 
	NTF -w "$1/$2 " "уже подключен" && return
    $MLOAD "$1/$2" 
    if [ "$?" = "0" ] ;then
	NTF -i gtk-ok "Модуль подключен" "$1/$2"
    else NTF -a "Ошибка подключения" "$1/$2" 
    fi
    MAIN
}
export -f DLOAD

DREPO(){ 
    ! wget  "$2" -O "$loaddir/$1" && { NTF -q gtk-error "Ошибка загрузки"  "$2" ; KILL ; exit 1 ; }
    DLOAD "$loaddir" "$1"
}
export -f DREPO

DUNLOAD(){ 
    $MUNLOAD "$1" 
    if [ "$?" = "0" ] ;then
	NTF -i gtk-ok "Модуль отключен" "$1"
    else  NTF -a "Ошибка отключения" "$1" ; KILL ; exit 1 
    fi
    MAIN
}
export -f DUNLOAD

AUFSN(){
#$(cat `ls -1 /sys/fs/aufs/si_*/br[0-9]*  |sort -n -k1.36`)
prefix=$(grep ' / aufs' /proc/mounts | cut -f2 -d= | tr ',' ' ' | cut -f1 -d' ')
N=1
while true ;  do 
		a="$( cat /sys/fs/aufs/si_${prefix}/br$N 2>/dev/null)"
		[ $a ] || break
		N=$((N + 1))
		n=$(seq -w 0 99 |sed -n "${N}p") # needed 01 02 03, not 1 2 3
    bundle=$(echo $a |awk -F= '{print $1}')
    loop=$(findmnt  $bundle -o SOURCE | tail -n1  | tr -d '],['  ) ; [ $loop ] || loop=$(df $bundle |tail -n1 | awk '{print $1}')
    source=$(losetup |grep  "$loop " |awk '{print $6}') ; [ $source ] || source=$loop
    basename "$source $N" 
done
}
export -f AUFSN

MAIN(){
KILL #двойной запуск
#list1="`awk -F/ '{print $NF" "$0}' $list |sort -u`"
list1="`awk '{print $1}' $list |awk -F/ '{print $NF" "$0}'  |sort -u`"
#list2="`losetup  -O BACK-FILE |tail -n+2 |sed 's,^.*/,,'`"
list2="`AUFSN`"
list3="`ls -1 "$loaddir"`"

yad --title="$msg_title" --list $yad_deco \
--column="Имя" \
--column="AUFS":NUM \
--text="Отключить. AUFS - порядок слоев. 1 - верхний " \
${list2[@]} \
--image=gtk-disconnect \
--plug=$$ \
--tabnum=1 \
--dclick-action='bash -c "DUNLOAD  %s"' \
--Xchecklist \
--Xmultiple \
--Xexpand-column=0 \
&

yad --title="$msg_title" --list $yad_deco \
--column="Имя" \
	--column="Репо" \
--separator=" " \
	--Xhide-column=2 \
	--Xprint-column=2 \
--text="Подключение модулей из внешнего репозитория" \
${list1[@]} \
--Xtitle="Закладка 1" \
--image=gtk-find \
--plug=$$ \
--tabnum=2 \
--dclick-action='bash -c "DREPO %s"' \
&

yad --title="$msg_title" --list $yad_deco \
--column="Имя" \
--text="Подкючить из $loaddir" \
${list3[@]} \
--image=gtk-connect \
--plug=$$ \
--tabnum=3 \
--dclick-action='bash -c "DLOAD  "$loaddir" %s"' \
&

yad --title="$msg_title" \
--notebook --mouse \
--tab="Подключенные" \
--tab="Репозиторий" \
--tab="Скачанные" \
--window-icon="gtk-index" \
--image="gtk-index" \
--text="<big><b>$msg_title</b></big>\n<small>Действие: двойное нажатие мыши на модуль\nПоиск: поставить курсор в столбец и нажать первые буквы названия
Сортировка: нажать на заголовок столбца</small>" \
--Xregex-search \
--Xbutton=gtk-close \
--width=800 \
--height=600 \
--Xno-buttons \
--Xclose-on-unfocus \
--Xbuttons-layout=center \
--Xbuttons-layout=center \
--active-tab=${1:-1} \
--key=$$ \
--button="Обновить репозитории"!gtk-refresh!"":4 \
--button="Подключить модуль"!gtk-connect!"Подключить локальный модуль":3 \
--button=$gtk-quit \
--Xfocus-field=1 \
--image-on-top
}
export -f MAIN

mkdir -p "$loaddir" 
[ -s "$list" ] || getlist 
MAIN
ex="$?"
if [ "$ex" = "3" ] ;then
    mod="`yad --title="$msg_title" --file --filename="$HOME"  --mouse \
	--window-icon="gtk-file" \
	--image="gtk-file" \
	--text="<big><b>Выберите модуль для подключения</b></big>" \
	`" &&
    DLOAD "`dirname "$mod"`" "`basename "$mod"`" ;MAIN
elif [ "$ex" = "4" ] ;then
    getlist  ; MAIN
fi
pkill -f "bash $0"