#!/bin/bash
# Подключение/Установка пакетов PFS (PuppyRus), by Zay.
# Версия 0.20, последнее изменение: 11.06.2013
#190725 sfs

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

status=0
checksfsxz >/dev/null && pfs_loader="$(which pfsload)" || pfs_loader=""
#which pfs && pfs_installer="${which pfsextract}" || pfs_installer="$(which pfsinstall)"
which pfs && pfs_installer="`which pfsextract`" || pfs_installer="`which pfsinstall`"
pfs_depends="$(which pfsdepends)"
[ "${pfs_loader}${pfs_installer}" = "" ] && exit 1

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_QUECTION () {
export DIALOG_QUECTION="<window title=\"$1\" resizable=\"false\"><vbox>
<vbox border-width=\"12\"><hbox><text use-markup=\"true\"><label>\"$2\"</label></text></hbox></vbox>
<hbox homogeneous=\"true\"><hbox><button yes></button><button no></button></hbox></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>"
}

function TIMEOUT_DIALOG () { sleep 10; ps ax | grep -v -F "grep" | grep -F "$1" | grep -q -F "gtkdialog" && kill $1; }

mountpoint="/mnt/.$(basename "${pack}")"
[ -d "${mountpoint}" ] && rmdir "${mountpoint}" 2>/dev/null

if [ ! -d "${mountpoint}" ]; 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

  # Подготовка окна диалога:
  which pfs && ramloader="pfsload -r" || ramloader="$(which pfsramload)"
  if [ "${ramloader}" != "" ]; then
    [ "${pfs_loader}" != "" ] && rmldvis="enabled" || rmldvis="disabled"
    RAMLD="<checkbox tooltip-text=\"PFS-файл будет скопирован в оперативную память. После этого можно размонтировать и извлечь носитель, не отключая PFS-файл. \">${IFS}<label>(Копировать модули в ОЗУ)</label>${IFS}<variable>CHECKBOX_RAMLOAD</variable>${IFS}<default>no</default>${IFS}<visible>${rmldvis}</visible>${IFS}</checkbox>"
  else
    CHECKBOX_RAMLOAD="false"
  fi
  if [ "${packageslist}" != "" ]; then
    numpack=1
    [ "${pfs_loader}" != "" ] && chbxvis="disabled" || chbxvis="enabled"
    chboxlist="`echo "${packageslist}" | while read package; do echo -n "<checkbox>${IFS}<label> ${package} </label>${IFS}<variable>PACKAGE_${numpack}</variable>${IFS}<default>yes</default>${IFS}<visible>${chbxvis}</visible>${IFS}</checkbox>${IFS}${IFS}"; numpack="$(expr ${numpack} + 1)"; done`"
    numpack=1
    [ "${pfs_loader}" != "" ] && visibleon="`echo "${packageslist}" | while read package; do echo -n "<action>if true disable:PACKAGE_${numpack}</action>${IFS}<action>if false enable:PACKAGE_${numpack}</action>${IFS}"; numpack="$(expr ${numpack} + 1)"; done`" || visibleon="<default>no</default>${IFS}<visible>disabled</visible>"  
    if [ "${pfs_installer}" != "" ]; then
      numpack=1
      if [ "${pfs_loader}" != "" ]; then
        visibleoff="`echo "${packageslist}" | while read package; do echo -n "<action>if true enable:PACKAGE_${numpack}</action>${IFS}<action>if false disable:PACKAGE_${numpack}</action>${IFS}"; numpack="$(expr ${numpack} + 1)"; done`" 
        [ "${ramloader}" != "" ] && visibleoff="${visibleoff}<action>if true disable:CHECKBOX_RAMLOAD</action>${IFS}<action>if false enable:CHECKBOX_RAMLOAD</action>${IFS}" 
      else
        visibleoff="<default>yes</default>${IFS}<visible>enabled</visible>"  
      fi
    else
      visibleoff="<visible>disabled</visible>"
    fi
  else
    chboxlist="<text><label>\"${IFS} ( Модули отсутствуют ) ${IFS}\"</label></text>"
    visibleoff="<visible>disabled</visible>"
  fi
    
  export MAIN_DIALOG="<window title=\"Подключение / Установка PFS\" icon-name=\"application-pfs\">
<vbox>
 <vbox scrollable=\"true\" height=\"70\"  border-width=\"0\"> 
  <text use-markup=\"true\"><label>\"<b>$1</b>\"</label></text>
  <text use-markup=\"true\" justify=\"2\"><label>\"<i>`pfsdesc $1`</i>\"</label></text>
 </vbox>
  <frame Подключение или установка модулей: >
 <vbox scrollable=\"true\" height=\"250\" width=\"400\" border-width=\"0\"> 
  ${chboxlist}
 </vbox>
  </frame>
 <hbox homogeneous=\"true\">
  <vbox>
   <hbox>
    <vbox>
     <hbox>
      <radiobutton tooltip-text=\"Подключить PFS-файл в корневую файловую систему. Модули сразу становятся доступны для использования. \">
       <label>Подключить  </label>
       <variable>RADIOBUTTON_MOUNT</variable>
       ${visibleon}
      </radiobutton>
      <radiobutton tooltip-text=\"Установить выбранные модули в систему. \">
       <label>Установить   </label>
       <variable>RADIOBUTTON_SETUP</variable>
       ${visibleoff}
      </radiobutton>
     </hbox> 
    ${RAMLD}
    </vbox>
     <vbox> 
      <checkbox tooltip-text=\"Имеющиеся в системе файлы не будут заменены файлами из модулей. \">
       <label>(в безопасном режиме)</label>
       <variable>CHECKBOX_LOWER</variable>
       <default>no</default>
      </checkbox>
     <hbox>
      <button width-request=\"100\"  is-focus=\"true\">
       <input file stock=\"gtk-apply\"></input>
       <label>OK</label>
       <variable>OKBUTTON</variable>
      </button>
      <button cancel>
      </button>
     </hbox>
     </vbox>
    </hbox>
   </vbox>
  </hbox>
 </vbox>
</window>"
    
  kill ${dlgwait} 2>/dev/null
  REST="`gtkdialog --program=MAIN_DIALOG --center`"

  eval "$REST"   
  [ "$EXIT" != "OK" ] && exit

  # Подключение пакета:
  if [ "$RADIOBUTTON_MOUNT" = "true" ]; then      
    export_DIALOG_INFO "Подключение..." "Подключение модуля..."
    gtkdialog --program=DIALOG_INFO --center &
    dlgwait=$!
      
    if [ "${CHECKBOX_RAMLOAD}" != "true" ]; then
      [ "$CHECKBOX_LOWER" = "false" ] && pfsload -u "${pack}" || pfsload -l "${pack}"
    else
      [ "$CHECKBOX_LOWER" = "false" ] && ${ramloader} -u "${pack}" || ${ramloader} -l "${pack}"
    fi
    status=$?
      
    if [ ${status} -eq 0 ]; then
      [ `find "${mountpoint}" 2>/dev/null | grep -ic "desktop$"` -gt 0 ] && fixmenus
      mfs="$(which mkfontscale)"
      mfd="$(which mkfontdir)"
      for fontdir in "/usr/X11R6/lib/X11/fonts/TTF" "/usr/share/fonts/default/TTF"
      do
        if [ -d "${mountpoint}/${fontdir}" ]; then
          cd "${fontdir}"
          [ "${mfs}" !=  "" ] && "${mfs}" .
          [ "${mfd}" !=  "" ] && "${mfd}" .	
        fi
      done
    fi

    if [ ${status} -eq 0 ]; then
      ### SFS_event support:
      sfsevent="$(which sfs_event_add)"
      [ "${sfsevent}" != "" ] && "${sfsevent}" "${pack}" &
      ###;
      LOAD_BUTTONS="<hbox homogeneous=\"true\"><button ok></button></hbox>"
      if [ "${pfs_depends}" != "" ]; then
        depslistall="`eval ${pfs_depends} -m $(echo "${packageslist}" | sed 's/^/\"/;s/$/\"/' | tr '\n' ' ' )`"
        if [ "${depslistall}" != "" ]; then
          wdepslist="$(echo "${depslistall}" | grep . | sed 's/^/<text><label> /;s/$/ <\/label><\/text>/')"
          [ "${wdepslist}" != "" ] && LOAD_DEPS="<hseparator></hseparator><text use-markup=\"true\"><label>\"${IFS} В системе не найдены cледующие модули-зависимости: \"</label></text><vbox scrollable=\"true\" height=\"120\"> ${wdepslist} </vbox>"
        fi
      fi
      if [ -f "${mountpoint}/tmp/.pfs/.command" ]; then
        cmd="$(cat "${mountpoint}/tmp/.pfs/.command")"
        if [ -x "$(which "${cmd}")" ]; then
          LOAD_CMDQ="<hseparator></hseparator><text use-markup=\"true\"><label>\"${IFS}Команда запуска программы: <b>${cmd}</b>${IFS}Выполнить команду сейчас? \"</label></text>"
          LOAD_BUTTONS="<hbox homogeneous=\"true\"><hbox><button yes></button><button no></button></hbox></hbox>"
        fi
      fi
      export LOAD_OK="<window title=\"Подключение PFS\" resizable=\"false\"><vbox><vbox border-width=\"12\"><hbox><vbox>
      <text use-markup=\"true\"><label>\"Модуль <b>$(basename "${pack}")</b> успешно подключен!\"</label></text>${LOAD_DEPS}${LOAD_CMDQ}</vbox></hbox></vbox>${LOAD_BUTTONS}</vbox></window>"
      kill ${dlgwait} 2>/dev/null
      if [ "${LOAD_CMDQ}" != "" ]; then
        eval "`gtkdialog --program=LOAD_OK --center`"
        [ "$EXIT" = "Yes" ] && "${cmd}" &     
      else
        (ntf -i "Модуль <i>$(basename "${pack}")</i>" "успешно подключен!" &) || gtkdialog --program=LOAD_OK --center &
        [ ! "${LOAD_DEPS}" ] && TIMEOUT_DIALOG $! &
      fi
    else
      kill ${dlgwait} 2>/dev/null
      export_DIALOG_ERROR "Ошибка!" "Не удалось подключить файл <b>$(basename "${pack}")</b>!"
      gtkdialog --program=DIALOG_ERROR --center & 
    fi
    exit ${status} 
  fi
    
  # Установка выбранных пакетов:
  if [ "$RADIOBUTTON_SETUP" = "true" ]; then
    instpacklist="`echo "${packageslist}" | while read package; do varpack="PACKAGE_${numpack}"; [ "${!varpack}" = "true" ] && echo -n \""${package}"\"" "; numpack="$(expr ${numpack} + 1)"; done`"
    if [ "${instpacklist}" != "" ]; then
      export_DIALOG_INFO "Установка..." "Идет процесс установки модулей. ${IFS} Пожалуйста, подождите..."
      gtkdialog --program=DIALOG_INFO --center &
      dlgwait=$!
	! which pfs && pfsinstall=pfsinstall && p="-p" || pfsinstall="pfsextract -i"
      if [ "$CHECKBOX_LOWER" = "false" ]; then
        eval '$pfsinstall "${pack}" $p ${instpacklist}'
      else
        eval 'pfsinstall "${pack}" -l -p ${instpacklist}'
      fi
      status=$?
        
      if [ ${status} -eq 0 ]; then
        mfs="$(which mkfontscale)"
        mfd="$(which mkfontdir)"
        for fontdir in "/usr/X11R6/lib/X11/fonts/TTF" "/usr/share/fonts/default/TTF"; do
          cd "${fontdir}"
          [ "${mfs}" !=  "" ] && "${mfs}" .
          [ "${mfd}" !=  "" ] && "${mfd}" .	
        done
        fixmenus
      fi

      if [ ${status} -eq 0 ]; then
        if [ "${pfs_depends}" != "" ]; then
          depslistall="`eval ${pfs_depends} -i ${instpacklist}`"
          if [ "${depslistall}" != "" ]; then
            wdepslist="$(echo "${depslistall}" | grep . | sed 's/^/<text><label> /;s/$/ <\/label><\/text>/')"
            [ "${wdepslist}" != "" ] && LOAD_DEPS="<hseparator></hseparator><text use-markup=\"true\"><label>\"${IFS} В системе не найдены cледующие модули-зависимости: \"</label></text><vbox scrollable=\"true\" height=\"120\"> ${wdepslist} </vbox>"
          fi
        fi
        export LOAD_OK="<window title=\" Установка PFS \" resizable=\"false\"><vbox><vbox border-width=\"12\"><hbox><vbox>
        <text use-markup=\"true\"><label>\"Модули успешно установлены!\"</label></text>${LOAD_DEPS}</vbox></hbox></vbox><hbox homogeneous=\"true\"><button ok></button></hbox></vbox></window>"
        kill ${dlgwait} 2>/dev/null
        gtkdialog --program=LOAD_OK --center &
      else                   
        export_DIALOG_ERROR "Ошибка!" "При установке модуля произошла ошибка!"
        kill ${dlgwait} 2>/dev/null
        gtkdialog --program=DIALOG_ERROR --center & 
      fi
    else
      export_DIALOG_MESSAGE "Установка PFS" "Модули не выбраны."
      gtkdialog --program=DIALOG_MESSAGE --center &
    fi  
    exit ${status}
  fi   

else
# Файл с таким названием подключен:
  
#  export_DIALOG_QUECTION "Отключение PFS" "Модуль <b>$(basename "${pack}")</b> подключен.${IFS}Отключить его сейчас?"
#  eval "`gtkdialog --program=DIALOG_QUECTION --center`"
  ntf -q "Отключение PFS" "Модуль <b>$(basename "${pack}")</b> подключен.${IFS}Отключить его сейчас?" && EXIT=Yes

  if [ "$EXIT" = "Yes" ]; then  
#    export_DIALOG_INFO " Отключение... " " Отключение модуля... "
#    gtkdialog --program=DIALOG_INFO --center &
#    dlgwait=$!
          
    fm="$(find "${mountpoint}" 2>/dev/null | grep -ic "desktop$")"
    [ -d "${mountpoint}/usr/X11R6/lib/X11/fonts/TTF" -o -d "${mountpoint}/usr/share/fonts/default/TTF" ] && nf=1 || nf=0
  
    wt "pfsunload "${pack}""
    status=$?
      
    if [ ${status} -eq 0 ]; then
      cmdfree="$(which pfsramfree)"
      [ "${cmdfree}" != "" ] && "${cmdfree}" "${filemnt}"
      [ ${fm} -gt 0 ] && fixmenus
      if [ ${nf} -gt 0 ]; then
        mfs="$(which mkfontscale)"
        mfd="$(which mkfontdir)"
        for fontdir in "/usr/X11R6/lib/X11/fonts/TTF" "/usr/share/fonts/default/TTF"; do
          cd "${fontdir}"
          [ "${mfs}" !=  "" ] && "${mfs}" .
          [ "${mfd}" !=  "" ] && "${mfd}" .		
	    done
      fi
    fi
    kill ${dlgwait} 2>/dev/null
      
    if [ ${status} -eq 0 ]; then
      ### SFS_event support:
      sfsevent="$(which sfs_event_rem)"
      [ "${sfsevent}" != "" ] && "${sfsevent}" "${pack}" &
      ###;
#      ntf -i "Отключение PFS" "Модуль <b>$(basename "${pack}")</b> отключен." || (\
#      export_DIALOG_MESSAGE "Отключение PFS" "Модуль <b>$(basename "${pack}")</b> отключен."
#      gtkdialog --program=DIALOG_MESSAGE --center &
#      TIMEOUT_DIALOG $! & )
    else
#      export_DIALOG_ERROR "Ошибка!" "ОШИБКА! Модуль <b>$(basename "${pack}")</b> не удалось отключить!"
#      gtkdialog --program=DIALOG_ERROR --center &
	klsof "${pack}"
	$0 "${pack}"
    fi
    exit ${status}

  fi
    
fi  
  
exit
