#!/bin/bash
# Редактирование PFS (PuppyRus), by Zay.
# Версия 0.8, последнее изменение: 20.10.2013
v=171129 #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>"
}

# Проверка версии ядра Linux:
checksfsxz >/dev/null
if [ $? -gt 0 ]; then
  export_DIALOG_ERROR "Ошибка!" "Используемое ядро Linux не поддерживает PFS."
  gtkdialog --program=DIALOG_ERROR --center &
  exit 1
fi

if [ $# -eq 0 ]; then
  funcopen() {
  echo "<hbox>
<entry fs-action=\"file\" fs-folder=\"/\" fs-filters=\"*.pfs\" fs-title=\"Выберите модуль.PFS\"><variable>ent${1}</variable></entry>
<button><input file stock=\"gtk-open\"></input><action>fileselect:ent${1}</action></button>
</hbox>"
  }
  export OPEN_DIALOG="<window title=\" Редактирование PFS v.$v\" icon-name=\"application-pfs\">
<vbox>
 <frame  Выберите один или несколько модулей.PFS: >
  "$(funcopen 0)"
  "$(funcopen 1)"
  "$(funcopen 2)"
  "$(funcopen 3)"
  "$(funcopen 4)"
  "$(funcopen 5)"
  "$(funcopen 6)"
  "$(funcopen 7)"
  "$(funcopen 8)"
  "$(funcopen 9)"
 </frame>
 <frame  Или укажите каталог с модулями.PFS: >
  <hbox>
   <entry fs-action=\"folder\" fs-folder=\"/\" fs-title=\"Выберите модуль.PFS\">
   <variable>entDir</variable>
   </entry>
   <button>
    <input file stock=\"gtk-open\"></input>
    <action>fileselect:entDir</action>
   </button>
  </hbox>
 </frame>
 <hbox>
  <button ok></button>
  <button cancel></button>
 </hbox>
</vbox>
</window>"
  OPEN="`gtkdialog --program=OPEN_DIALOG --center`"
  eval "${OPEN}" 
  [ "$EXIT" != "OK" ] && exit
  "$0" "${ent0}" "${ent1}" "${ent2}" "${ent3}" "${ent4}" "${ent5}" "${ent6}" "${ent7}" "${ent8}" "${ent9}" "${entDir}" &
  exit
fi  
status=0
 
export_DIALOG_INFO "Чтение..." "Чтение файлов..."    
gtkdialog --program=DIALOG_INFO --center &
dlgwait=$!
  
for arg in "$@"
do
  if [ "${arg}" != "" ]; then
    if [ -d "${arg}" ]; then
      listpfs="`find "${arg}" -mindepth 1 -maxdepth 1 -type f -name '*.pfs' | sort -f | while read PFILE
      do
        echo -n "${listpfs}<item>$(realpath "${PFILE}")</item>${IFS}"
      done`" 
      packageslist="${packageslist}`find "${arg}" -mindepth 1 -maxdepth 1 -type f -name '*.pfs' | sort -f | while read PFILE
      do
        echo "$(pfsinfo "${PFILE}")"   
      done`${IFS}"
    fi
  fi
done
  
for arg in "$@"
do
  if [ "${arg}" != "" ]; then
    if [ -f "${arg}" ]; then
      listpfs="${listpfs}<item>$(realpath "${arg}")</item>${IFS}"
      # Получение списка встроенных пакетов:
      packageslist="${packageslist}$(pfsinfo "${arg}")${IFS}"
      if [ $? -gt 0 ]; then
        if [ "$(disktype "${arg}" | grep -F 'squashfs, version 4')" = "" ];then
          texterror="Файл $(basename "${arg}") не является модулем.PFS."
        else
          texterror="Ошибка чтения файла $(basename "${arg}")."
        fi   
        export_DIALOG_ERROR "Ошибка!" "${texterror}"
        kill ${dlgwait} 2>/dev/null
        gtkdialog --program=DIALOG_ERROR --center &
        echo "Error: Invalid *.pfs file!"; exit ${status}
      fi
    else
      if [ ! -d "${arg}" ]; then
        export_DIALOG_MESSAGE "Редактор PFS" "Файл <b>${arg}</b> не найден!"
        kill ${dlgwait} 2>/dev/null
        gtkdialog --program=DIALOG_MESSAGE --center &
        echo "$(basename "$0"): File \"${arg}\" not found!"; exit 1
      fi  
    fi
  fi
done
  
if [ "${listpfs}" = "" ]; then
  kill ${dlgwait} 2>/dev/null
  "$0" &
  exit
fi
if [ $(echo "${listpfs}" | wc -l) -gt 126 ]; then
  kill ${dlgwait} 2>/dev/null
  export_DIALOG_ERROR "Ошибка!" "Нельзя редактировать более чем 126 модулей.PFS одновременно."
  gtkdialog --program=DIALOG_ERROR --center &
  exit
fi
  
# Проверка наличия одинаковых пакетов:
if [ "$(echo "${packageslist}" | sort )" != "$(echo "${packageslist}" | sort -u )" ];then
  export DUP_DIALOG="<window title=\" Ошибка! \" resizable=\"false\" icon-name=\"gtk-stop\">
  <vbox>
   <vbox border-width=\"12\">
    <text><label>\"В выбранных модулях.PFS были обнаружены ${IFS}следующие пакеты с одинаковыми названиями:\"</label></text>   
    <vbox border-width=\"12\" scrollable=\"true\" height=\"180\" width=\"340\"> 
     <text><label>\"$(echo "${packageslist}" | sort | uniq -d | sort -f) \"</label></text>
    </vbox>
    <text><label>\"Прежде чем продолжить работу необходимо ${IFS}удалить повторяющиеся модули.PFS ${IFS}(c помощью этого редактора).\"</label></text> 
    </vbox>
    <hbox homogeneous=\"true\"><button ok></button></hbox>
   </vbox>
  </window>"
  kill ${dlgwait} 2>/dev/null
  gtkdialog --program=DUP_DIALOG --center &
  exit 1 
fi

# Подготовка окна диалога:  
if [ "${packageslist}" != "" ]; then
  numpack=1
  chboxlist="`echo "${packageslist}" | sort -f | while read package
    do
      if [ "${package}" != "" ]; then
        echo -n "<checkbox>${IFS}<label> ${package} </label>${IFS}<variable>PACKAGE_${numpack}</variable>${IFS}<default>yes</default>${IFS}</checkbox>${IFS}${IFS}"
        numpack="$(expr ${numpack} + 1)"
      fi
    done`"
fi    
if [ ! "${chboxlist}" ]; then
  export_DIALOG_ERROR "Ошибка!" "В выбранных файлах и/или каталогах отсутствуют пакеты!"
  kill ${dlgwait} 2>/dev/null
  gtkdialog --program=DIALOG_ERROR --center &
  exit 1    
fi
      
export MAIN_DIALOG="<window title=\"Редактирование PFS\">
<vbox>
 <frame  Исходные файлы: >
  <tree selection-mode=\"0\" headers-visible=\"false\">
   <height>68</height>
   <width>450</width>
   ${listpfs}
  </tree>
 </frame>
 <frame  Список пакетов: >
  <vbox scrollable=\"true\" height=\"250\" width=\"450\"> 
   ${chboxlist}
  </vbox>
 </frame>
 <vbox>
 <frame  Команда запуска (необязательно): >  
  <entry>
   <variable>CMDRUN</variable>
  </entry>
 </frame>
 </vbox>
 <vbox>
 <frame  Новый файл: >  
  <hbox>
   <entry accept=\"savefilename\" fs-folder=\"$(dirname "$1")\">
    <variable>ENTFILE</variable>
   </entry>
   <button>
    <input file stock=\"gtk-open\"></input>
    <action type=\"fileselect\">ENTFILE</action>
   </button>
  </hbox>
 </frame>
 </vbox>
 <hbox homogeneous=\"true\" border-width=\"3\">
  <button>
   <label>\"    Создать PFS    \"</label>
   <action type=\"exit\">MERGE</action>
  </button>
 </hbox>
</vbox>
</window>"
    
kill ${dlgwait} 2>/dev/null
REST="`gtkdialog --program=MAIN_DIALOG --center`"

eval "${REST}"

# Сборка:
if [ "$EXIT" = "MERGE" ]; then

  if [ "${ENTFILE}" = "" ]; then
    export_DIALOG_MESSAGE "Редактор PFS" "Укажите название для нового файла."
    gtkdialog --program=DIALOG_MESSAGE --center   
    eval '"$0" "$@" &'
    exit 1
  fi
    
  outpfs="$(dirname ${ENTFILE})/$(basename ${ENTFILE} .pfs).pfs"
  if [ -f "${outpfs}" ]; then
    export_DIALOG_MESSAGE "Редактор PFS" "Файл <b>${outpfs}</b> уже существует! ${IFS} Укажите другое название для нового файла.\n"
    gtkdialog --program=DIALOG_MESSAGE --center 
    eval '"$0" "$@" &'
    exit 1
  fi
  mkdir -p "$(dirname "${outpfs}")"
    
  checknopacks="`echo "${packageslist}" | sort -f | while read package
    do
      if [ "${package}" != "" ]; then
        varpack="PACKAGE_${numpack}"
        if [ "${!varpack}" = "true" ]; then
          echo 'true'
          break
        fi
        numpack="$(expr ${numpack} + 1)"
      fi
    done`"
  if [ "${checknopacks}" = "" ]; then
    export_DIALOG_MESSAGE "Извлечение PFS" "Модули не выбраны."
    gtkdialog --program=DIALOG_MESSAGE --center
    eval '"$0" "$@" &'
    exit 1
  fi   
    
  cutpacklist="`echo "${packageslist}" | sort -f | while read package
    do
      if [ "${package}" != "" ]; then
        varpack="PACKAGE_${numpack}"
        [ "${!varpack}" = "false" ] && echo -n \""${package}"\"" "
        numpack="$(expr ${numpack} + 1)"
      fi
    done`"

  export_DIALOG_INFO "Создание PFS..." "Создание модуля.PFS. ${IFS}Пожалуйста, подождите..."    
  gtkdialog --program=DIALOG_INFO --center &
    
  dlgwait=$!

which pfs && pfsmerge="mkpfs -m" && o="-o" || pfsmerge=pfsmerge
  if [ "${CMDRUN}" = "" ]; then
    eval '$pfsmerge "$@" $o "${outpfs}" -no-progress --clean -c ${cutpacklist}'
  else
    eval '$pfsmerge "$@" $o "${outpfs}" -no-progress --clean -a "${CMDRUN}" -c ${cutpacklist}'
  fi
  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

  exit ${status}
else
  exit
fi

exit
