diff --git a/src/pm b/src/pm index e777caf..3739ec6 100755 --- a/src/pm +++ b/src/pm @@ -51,26 +51,29 @@ fi #------------ check status function ------------ check() { - [ $1 -ne 0 ] \ - && printf "${BBLUE}**${BWHITE} $2 [${BRED} ERROR ${BWHITE}]\n${RESET}" \ - && exit $1 + if [ $1 -ne 0 ]; then + printf "${BBLUE}**${BWHITE} $2 [${BRED} ERROR ${BWHITE}]\n${RESET}" + exit $1 + fi printf "${BBLUE}**${BWHITE} $2 [${BGREEN} SUCCESS ${BWHITE}]\n${RESET}" } #----------------------------------------------- #---------------- check root priveleges function ------------------------ checkroot() { - [[ $(id -u) != 0 ]] \ - && printf "${BBLUE}**${BWHITE} You must be root [${BRED} ERROR ${BWHITE}]\n${RESET}" \ - && exit 1 + if [ $(id -u) -ne 0 ]; then + printf "${BBLUE}**${BWHITE} You must be root [${BRED} ERROR ${BWHITE}]\n${RESET}" + exit 1 + fi } #------------------------------------------------------------------------ # check non root priveleges function checknonroot() { - [[ $(id -u) == 0 ]] \ - && printf "${BBLUE}**${BWHITE} You must be non root [${BRED} ERROR ${BWHITE}]\n${RESET}" \ - && exit 1 + if [ $(id -u) = 0 ]; then + printf "${BBLUE}**${BWHITE} You must be non root [${BRED} ERROR ${BWHITE}]\n${RESET}" + exit 1 + fi } # ---------------------------------- @@ -106,7 +109,7 @@ down() { serverdir=$(echo $serverdir | sed -e "/ftp:\/\//s///") repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///') for j in $repoquery; do - if [[ "$(get_pkgname $j)" == "$k" ]]; then + if [ "$(get_pkgname $j)" = "$(get_pkgname $k)" ] || [ "$(get_pkgname $j)" = "$k" ]; then if [ ! -f $cachedpkgdir/$j.pkg.gz ]; then printf "${YELLOW}**${RESET} Downloading ${YELLOW}$serverdir: ${BWHITE}$j\n${RESET}" echo $i/$j.pkg.gz @@ -114,14 +117,15 @@ down() { check $? "Download package" else printf "${YELLOW}**${GREEN} successful downloaded $k\n${RESET}" - downloaded=y + export downloaded=y fi - downloaded=y + export downloaded=y fi done done - if [ "$downloaded" == "n" ]; then + if [ "$downloaded" = "n" ]; then printf "${BBLUE}**${BWHITE} Can't find package $k [${BRED} ERROR ${BWHITE}]\n${RESET}" + exit 1 fi continue done @@ -134,68 +138,120 @@ download() { #-------------------- unpack local package archive ---------------------- unpack() { checkroot - [[ "$archives" == "" ]] \ - && printf "${BBLUE}**${BWHITE} Specify package name [${BRED} ERROR ${BWHITE}]\n${RESET}" \ - && exit 1 - for i in $archives; do - if [ ! -f $i ]; then - printf "${BBLUE}**${BWHITE} File $i not found [${BRED} ERROR ${BWHITE}]\n${RESET}" \ + if [[ "$archives" == "" ]]; then + printf "${BBLUE}**${BWHITE} Specify package name [${BRED} ERROR ${BWHITE}]\n${RESET}" + exit 1 + fi + + # Сохраняем список архивов для итерации, чтобы он не перезатерся + local_archives="$archives" + + for archive in $local_archives; do + if [ ! -f $archive ]; then + printf "${BBLUE}**${BWHITE} File $archive not found [${BRED} ERROR ${BWHITE}]\n${RESET}" \ && exit 1 fi - packagename=$(echo $i | sed -e "/.gz/s///") + packagename=$(echo $archive | sed -e "/.gz/s///") packagename=${packagename#*pkg/} printf "${YELLOW}**${GREEN} Installing ${packagename%.pkg*}\n${RESET}" - [ ! -f $packagesqueryfile ] \ - && printf "${BBLUE}**${BWHITE} Can't find $packagesqueryfile [${BRED} ERROR ${BWHITE}]\n${RESET}" \ + if [ ! -f $packagesqueryfile ]; then + printf "${BBLUE}**${BWHITE} Can't find $packagesqueryfile [${BRED} ERROR ${BWHITE}]\n${RESET}" \ && exit 1 + fi installed=false - for i in $(/usr/bin/cat $packagesqueryfile); do - [ "$i" = "${packagename%.pkg*}" ] \ - && export installed=true \ - && break + # Используем уникальное имя переменной для цикла + for installed_pkg in $(/usr/bin/cat $packagesqueryfile); do + if [ "$installed_pkg" = "${packagename%.pkg*}" ]; then + export installed=true + break + fi done - [[ "$installed" == "true" ]] \ - && printf "${YELLOW}**${RESET} Package already installed:${YELLOW} reinstalling\n${RESET}" + if [[ "$installed" == "true" ]]; then + printf "${YELLOW}**${RESET} Package already installed:${YELLOW} reinstalling\n${RESET}" + fi tar -xf $cachedpkgdir/$packagename.gz -C $rootdir/tmp cd $rootdir/tmp/$packagename - [ -f pre_install ] \ - && /usr/bin/sh -c ./pre_install \ - && rm -v pre_install &> /dev/null + if [ -f pre_install ]; then + /usr/bin/sh -c ./pre_install + rm -v pre_install &> /dev/null + fi if [ -f deps ]; then printf "${YELLOW}**${GREEN} Checking deps\n${RESET}" - deps=$(/usr/bin/cat deps) - for dep in $deps; do + pkg_deps=$(/usr/bin/cat deps) + + missing_deps="" + # Используем уникальное имя переменной + for dep in $pkg_deps; do have=false - for pack in $(/usr/bin/cat $packagesqueryfile); do - if [ $pack = $dep ]; then + for installed_pack in $(/usr/bin/cat $packagesqueryfile); do + if [ $installed_pack = $dep ]; then have=yes break fi done if [ "$have" = "false" ]; then - pkgnow=$packagename - add "" $dep - unpack $cachedpkgdir/$pkgnow.gz - return + missing_deps="$missing_deps $dep" fi done - mkdir $installedpackagesdir/$packagename &> /dev/null + + # Если есть недостающие зависимости, устанавливаем их + if [ ! -z "$missing_deps" ]; then + printf "${YELLOW}**${GREEN} Installing missing dependencies: $missing_deps\n${RESET}" + # Сохраняем полное текущее состояние + saved_packagename="$packagename" + saved_archives="$archives" + saved_packages="$packages" + saved_dir=$(pwd) + + # Устанавливаем все недостающие зависимости + for missing_dep in $missing_deps; do + printf "${YELLOW}**${GREEN} Installing dependency: $missing_dep\n${RESET}" + + # Переходим в безопасную директорию перед вызовом add + cd $rootdir + + # Устанавливаем переменные для add + packages="$missing_dep" + archives="" + + # Вызываем add, который скачает и установит зависимость + # add изменит глобальные переменные packages и archives + add + + # Возвращаемся в директорию текущего пакета + cd "$saved_dir" + done + + # Полностью восстанавливаем сохраненные переменные + packagename="$saved_packagename" + archives="$saved_archives" + packages="$saved_packages" + + printf "${YELLOW}**${GREEN} Continuing installation of ${packagename%.pkg*}\n${RESET}" + fi + + mkdir -p $installedpackagesdir/$packagename &> /dev/null mv -v deps $installedpackagesdir/$packagename &> /dev/null fi - mkdir $installedpackagesdir/$packagename &> /dev/null + mkdir -p $installedpackagesdir/$packagename &> /dev/null mv -v list $installedpackagesdir/$packagename &> /dev/null - [ -f pre_delete ] \ - && mv -v pre_delete $installedpackagesdir/$packagename &> /dev/null - [ -f post_delete ] \ - && mv -v post_delete $installedpackagesdir/$packagename &> /dev/null + if [ -f pre_delete ]; then + mv -v pre_delete $installedpackagesdir/$packagename &> /dev/null + fi + if [ -f post_delete ]; then + mv -v post_delete $installedpackagesdir/$packagename &> /dev/null + fi cp -r ./* $rootdir/ - [ -f $rootdir/post_install ] \ - && rm $rootdir/post_install - [ -f $rootdir/tmp/$packagename/post_install ] \ - && printf "${YELLOW}**${GREEN} post_install script ${packagename%.pkg*}\n${RESET}" \ - && /usr/bin/sh -c $rootdir/tmp/$packagename/post_install &> /dev/null - [[ "$installed" == "false" ]] \ - && echo ${packagename%.pkg*} >> $packagesqueryfile + if [ -f $rootdir/post_install ]; then + mv -v $rootdir/post_install $installedpackagesdir/$packagename &> /dev/null + fi + if [ -f $rootdir/tmp/$packagename/post_install ]; then + printf "${YELLOW}**${GREEN} post_install script ${packagename%.pkg*}\n${RESET}" + /usr/bin/sh -c $rootdir/tmp/$packagename/post_install &> /dev/null + fi + if [[ "$installed" == "false" ]]; then + echo ${packagename%.pkg*} >> $packagesqueryfile + fi rm -rv $rootdir/tmp/$packagename &> /dev/null printf "${YELLOW}**${GREEN} Installed ${packagename%.pkg*} successful\n${RESET}" cd - &> /dev/null