#!/bin/bash
# Извлечение пакетов PFS (PuppyRus), by Zay.
# Версия 0.4, последнее изменение: 15.01.2013
#171129 pfs v3 sfs 
function export_DIALOG_INFO () {
export DIALOG_INFO="<window title=\"$1\" resizable=\"false\">
<vbox border-width=\"16\"><text><label>\"$2\"</label></text></vbox>
</window>"
}

function export_DIALOG_MESSAGE () {
export DIALOG_MESSAGE="<window title=\"$1\" resizable=\"false\"><vbox>
<vbox border-width=\"12\"><hbox><text use-markup=\"true\"><label>\"$2\"</label></text></hbox></vbox>
<hbox homogeneous=\"true\"><button ok></button></hbox>
</vbox></window>"
}

function export_DIALOG_ERROR () {
export DIALOG_ERROR="<window title=\"$1\" resizable=\"false\" icon-name=\"gtk-stop\"><vbox>
<vbox border-width=\"12\"><hbox>
 <pixmap icon_size=\"3\"><input file stock=\"gtk-stop\"></input></pixmap>
 <text use-markup=\"true\"><label>\"$2\"</label></text>
</hbox></vbox>
<hbox homogeneous=\"true\"><button ok></button></hbox>
</vbox></window>"
}

CH_META(){ #161206 sfs (
if [ "`unsquashfs -l "$1" |grep /etc/packages/mount |egrep '.files$' |wc -l`" -lt 2 ] ;then
kill ${dlgwait} 2>/dev/null
#to="`basename "$1" |sed 's/.pfs$//'`"
to="`basename "$1" |sed 's/\.[^.]\+$//'`"
echo $to

# if [ "`which ntf`" ] ;then #pra
    ntf -q "Модуль $1" "состоит из одного модуля (не составной)
Распаковать?" && `which sudo` wt "`which sudo` pfsextract "$1"" 
#Распаковать?" && `which sudo` wt "unsquashfs -n -d "$to" "$1"" 
# else
#    e=ERROR
#    m=$(`which sudo` unsquashfs -n -d "$to" "$1" 2>&1) && m="Успешно распакован в $to" && e=INFO
#    export_DIALOG_$e " Модуль $1 " "Модуль $1 $m "
#    gtkdialog --program=DIALOG_$e --center &
# fi
exit 
fi
} ###) sfs

if [ ! "$1" ]; then
  export CHOOSER_DIALOG="<window title=\"Выберите файл PFS\" resizable=\"false\"  icon-name=\"application-pfs\">
<vbox>
 <chooser>
  <variable>CHOOSER</variable>
  <default>/</default>
  <width>600</width>
  <height>400</height>
  </chooser>
 <hbox>
  <button ok></button>
  <button cancel></button>
 </hbox>
</vbox>
</window>"
  INF="`gtkdialog --program=CHOOSER_DIALOG --center`"
  eval "${INF}"
  infile="${CHOOSER}"
else
  if [ $# -gt 1 ]; then
    for arg in "$@"; do
      "$0" "${arg}"
    done; exit
  fi
  infile="$1"
fi

if [ -f "${infile}" ]; then
  pack="$(realpath "${infile}")"
else
  echo "$(basename "$0"): File \"${infile}\" not found!"; exit 1
fi



status=0


# Проверка версии ядра Linux:
if checksfsxz >/dev/null; then
  
  export_DIALOG_INFO " Чтение... " " Чтение файла... "    
  gtkdialog --program=DIALOG_INFO --center &
  dlgwait=$!
 
  # Проверка файла и получение списка встроенных пакетов:
  if [ "$(disktype "${pack}" | grep -F 'squashfs, version 4')" != "" ];then
    packageslist="$(pfsinfo "${pack}")"
    status=$?  
    [ ${status} -gt 0 ] && texterror="Ошибка чтения файла $(basename "${pack}")."
  else  
    texterror="Файл $(basename "${pack}") не является PFS-модулем."
    status=1
  fi
  if [ ${status} -gt 0 ]; then   
    export_DIALOG_ERROR " Ошибка! " "  ${texterror}"
    kill ${dlgwait} 2>/dev/null
    gtkdialog --program=DIALOG_ERROR --center &
    echo "Error: Invalid *.pfs file!"; exit ${status}
  fi  
CH_META "$infile" #"$1" ###sfs
  # Подготовка окна диалога:
  if [ "${packageslist}" != "" ]; then
    numpack=1
    chboxlist="`echo "${packageslist}" | while read package
      do
        echo -n "<checkbox>${IFS}<label> ${package} </label>${IFS}<variable>PACKAGE_${numpack}</variable>${IFS}<default>no</default>${IFS}</checkbox>${IFS}${IFS}"
        numpack="$(expr ${numpack} + 1)"
      done`"
  else
    export_DIALOG_ERROR " Извлечение PFS " " Модули не найдены! "
    kill ${dlgwait} 2>/dev/null
    gtkdialog --program=DIALOG_ERROR --center &
    exit 1
  fi
  startpath="$(echo "${pack}" | sed 's/.pfs/_pfs/g')"
t1="Распаковка составного.pfs"
  export MAIN_DIALOG="<window title=\" $t1 \" icon-name=\"application-pfs\">
<vbox>
 <vbox scrollable=\"true\" height=\"374\" width=\"374\"> 
  ${chboxlist}
 </vbox>
 <hbox>	
  <entry fs-action=\"newfolder\" tooltip-text=\"Укажите каталог для извлечения\" fs-folder=\"$(dirname "${infile}")\">
   <default>\"${startpath}\"</default>
   <variable>ENTDIR</variable>
  </entry>			
  <button>
   <input file stock=\"gtk-open\"></input>
   <action>fileselect:ENTDIR</action>
  </button>
 </hbox>
 <hbox homogeneous=\"false\" border-width=\"3\">
  <button>
   <input file icon=\"application-pfs\"></input>
   <label>\"Извлечь выбранные модули\"</label>
   <action type=\"exit\">EXTRACT</action>
  </button>
  <button cancel></button>
 </hbox>
</vbox>
</window>"
    
  kill ${dlgwait} 2>/dev/null
  REST="`gtkdialog --program=MAIN_DIALOG --center`"

  eval "${REST}"

  # Извлечение выбранных пакетов:
  if [ "${EXIT}" = "EXTRACT" ]; then
    extpacklist="`echo "${packageslist}" | while read package
      do
        varpack="PACKAGE_${numpack}"
        [ "${!varpack}" = "true" ] && echo -n \""${package}"\"" "
        numpack="$(expr ${numpack} + 1)"
      done`"
    if [ "${extpacklist}" != "" ]; then
#            ntf -w "=${ENTDIR}=${startpath}="
      if [ "${ENTDIR}" != "${startpath}" ]; then
        if [ -d "${ENTDIR}" ]; then
          if [ "$(ls -A "${ENTDIR}" 2>/dev/null)" = "" ]; then
            outdir="${ENTDIR}"
          else
            export_DIALOG_ERROR " Ошибка! " " Каталог <b>${ENTDIR}</b> не пуст! ${IFS} Укажите другой каталог. "
            gtkdialog --program=DIALOG_ERROR --center
            "$0" "${infile}" &
            exit 1
          fi
        else
          outdir="${ENTDIR}"
        fi
      else
        if [ "$(ls -A "${ENTDIR}" 2>/dev/null)" != "" ]; then
          export_DIALOG_ERROR " Ошибка! " " Каталог <b>${ENTDIR}</b> не пуст! ${IFS} Укажите другой каталог. "
          gtkdialog --program=DIALOG_ERROR --center
          "$0" "${infile}" &
          exit 1
        fi        
          outdir="${ENTDIR}"
      fi
     
#      export_DIALOG_INFO " Извлечение... " " Извлечение пакетов. ${IFS} Пожалуйста, подождите... "      
#      gtkdialog --program=DIALOG_INFO --center &
#      dlgwait=$!
        
#      eval 'pfsextract "${pack}" "${outdir}" -no-progress -p ${extpacklist}'
    which pfs && o="-o" || p="-p" #pfs v2
#      eval 'pfsextract "${pack}" "${outdir}" -no-progress '$p' ${extpacklist}'
#      ntf -w  "`which sudo` pfsextract "${pack}" $o "${outdir}" -no-progress $p ${extpacklist}"
    wt "`which sudo` pfsextract "${pack}" $o "${outdir}" -no-progress $p ${extpacklist}"
NTF2(){
      status=$?
      kill ${dlgwait} 2>/dev/null  
      if [ ${status} -eq 0 ]; then
        export_DIALOG_MESSAGE " Извлечение PFS " " Пакеты успешно извлечены! "
        gtkdialog --program=DIALOG_MESSAGE --center &
      else
        export_DIALOG_ERROR " Ошибка! " " При извлечении пакета произошла ошибка! "
        gtkdialog --program=DIALOG_ERROR --center
      fi
}
    else
#      export_DIALOG_MESSAGE " Извлечение PFS " " Пакеты не выбраны. "
#      gtkdialog --program=DIALOG_MESSAGE --center
      ntf -a "Извлечение PFS" "Модули не выбраны."
      "$0" "${infile}" &
      exit
    fi 
     
    exit ${status}
  else
    exit
  fi
else
#  export_DIALOG_ERROR " Ошибка! " "  Используемое ядро Linux не поддерживает PFS. "
#  gtkdialog --program=DIALOG_ERROR --center &
  ntf -a "Ошибка!" "Используемое ядро Linux не поддерживает PFS."
  exit 1
fi
exit
