This commit is contained in:
wt committed 2025-09-30 18:02:31 +07:00
1 parent a8c4a287eb
commit 755df2c2c1
1 file changed
+108 -52
+108 -52
View File
@@ -51,26 +51,29 @@ fi
#------------ check status function ------------ #------------ check status function ------------
check() { check() {
[ $1 -ne 0 ] \ if [ $1 -ne 0 ]; then
&& printf "${BBLUE}**${BWHITE} $2 [${BRED} ERROR ${BWHITE}]\n${RESET}" \ printf "${BBLUE}**${BWHITE} $2 [${BRED} ERROR ${BWHITE}]\n${RESET}"
&& exit $1 exit $1
fi
printf "${BBLUE}**${BWHITE} $2 [${BGREEN} SUCCESS ${BWHITE}]\n${RESET}" printf "${BBLUE}**${BWHITE} $2 [${BGREEN} SUCCESS ${BWHITE}]\n${RESET}"
} }
#----------------------------------------------- #-----------------------------------------------
#---------------- check root priveleges function ------------------------ #---------------- check root priveleges function ------------------------
checkroot() { checkroot() {
[[ $(id -u) != 0 ]] \ if [ $(id -u) -ne 0 ]; then
&& printf "${BBLUE}**${BWHITE} You must be root [${BRED} ERROR ${BWHITE}]\n${RESET}" \ printf "${BBLUE}**${BWHITE} You must be root [${BRED} ERROR ${BWHITE}]\n${RESET}"
&& exit 1 exit 1
fi
} }
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# check non root priveleges function # check non root priveleges function
checknonroot() { checknonroot() {
[[ $(id -u) == 0 ]] \ if [ $(id -u) = 0 ]; then
&& printf "${BBLUE}**${BWHITE} You must be non root [${BRED} ERROR ${BWHITE}]\n${RESET}" \ printf "${BBLUE}**${BWHITE} You must be non root [${BRED} ERROR ${BWHITE}]\n${RESET}"
&& exit 1 exit 1
fi
} }
# ---------------------------------- # ----------------------------------
@@ -106,7 +109,7 @@ down() {
serverdir=$(echo $serverdir | sed -e "/ftp:\/\//s///") serverdir=$(echo $serverdir | sed -e "/ftp:\/\//s///")
repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///') repoquery=$(/usr/bin/cat $reposquerydir/$serverdir/query | sed -e '/.pkg.gz/s///')
for j in $repoquery; do 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 if [ ! -f $cachedpkgdir/$j.pkg.gz ]; then
printf "${YELLOW}**${RESET} Downloading ${YELLOW}$serverdir: ${BWHITE}$j\n${RESET}" printf "${YELLOW}**${RESET} Downloading ${YELLOW}$serverdir: ${BWHITE}$j\n${RESET}"
echo $i/$j.pkg.gz echo $i/$j.pkg.gz
@@ -114,14 +117,15 @@ down() {
check $? "Download package" check $? "Download package"
else else
printf "${YELLOW}**${GREEN} successful downloaded $k\n${RESET}" printf "${YELLOW}**${GREEN} successful downloaded $k\n${RESET}"
downloaded=y export downloaded=y
fi fi
downloaded=y export downloaded=y
fi fi
done done
done done
if [ "$downloaded" == "n" ]; then if [ "$downloaded" = "n" ]; then
printf "${BBLUE}**${BWHITE} Can't find package $k [${BRED} ERROR ${BWHITE}]\n${RESET}" printf "${BBLUE}**${BWHITE} Can't find package $k [${BRED} ERROR ${BWHITE}]\n${RESET}"
exit 1
fi fi
continue continue
done done
@@ -134,68 +138,120 @@ download() {
#-------------------- unpack local package archive ---------------------- #-------------------- unpack local package archive ----------------------
unpack() { unpack() {
checkroot checkroot
[[ "$archives" == "" ]] \ if [[ "$archives" == "" ]]; then
&& printf "${BBLUE}**${BWHITE} Specify package name [${BRED} ERROR ${BWHITE}]\n${RESET}" \ printf "${BBLUE}**${BWHITE} Specify package name [${BRED} ERROR ${BWHITE}]\n${RESET}"
&& exit 1 exit 1
for i in $archives; do fi
if [ ! -f $i ]; then
printf "${BBLUE}**${BWHITE} File $i not found [${BRED} ERROR ${BWHITE}]\n${RESET}" \ # Сохраняем список архивов для итерации, чтобы он не перезатерся
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 && exit 1
fi fi
packagename=$(echo $i | sed -e "/.gz/s///") packagename=$(echo $archive | sed -e "/.gz/s///")
packagename=${packagename#*pkg/} packagename=${packagename#*pkg/}
printf "${YELLOW}**${GREEN} Installing ${packagename%.pkg*}\n${RESET}" printf "${YELLOW}**${GREEN} Installing ${packagename%.pkg*}\n${RESET}"
[ ! -f $packagesqueryfile ] \ if [ ! -f $packagesqueryfile ]; then
&& printf "${BBLUE}**${BWHITE} Can't find $packagesqueryfile [${BRED} ERROR ${BWHITE}]\n${RESET}" \ printf "${BBLUE}**${BWHITE} Can't find $packagesqueryfile [${BRED} ERROR ${BWHITE}]\n${RESET}" \
&& exit 1 && exit 1
fi
installed=false installed=false
for i in $(/usr/bin/cat $packagesqueryfile); do # Используем уникальное имя переменной для цикла
[ "$i" = "${packagename%.pkg*}" ] \ for installed_pkg in $(/usr/bin/cat $packagesqueryfile); do
&& export installed=true \ if [ "$installed_pkg" = "${packagename%.pkg*}" ]; then
&& break export installed=true
break
fi
done done
[[ "$installed" == "true" ]] \ if [[ "$installed" == "true" ]]; then
&& printf "${YELLOW}**${RESET} Package already installed:${YELLOW} reinstalling\n${RESET}" printf "${YELLOW}**${RESET} Package already installed:${YELLOW} reinstalling\n${RESET}"
fi
tar -xf $cachedpkgdir/$packagename.gz -C $rootdir/tmp tar -xf $cachedpkgdir/$packagename.gz -C $rootdir/tmp
cd $rootdir/tmp/$packagename cd $rootdir/tmp/$packagename
[ -f pre_install ] \ if [ -f pre_install ]; then
&& /usr/bin/sh -c ./pre_install \ /usr/bin/sh -c ./pre_install
&& rm -v pre_install &> /dev/null rm -v pre_install &> /dev/null
fi
if [ -f deps ]; then if [ -f deps ]; then
printf "${YELLOW}**${GREEN} Checking deps\n${RESET}" printf "${YELLOW}**${GREEN} Checking deps\n${RESET}"
deps=$(/usr/bin/cat deps) pkg_deps=$(/usr/bin/cat deps)
for dep in $deps; do
missing_deps=""
# Используем уникальное имя переменной
for dep in $pkg_deps; do
have=false have=false
for pack in $(/usr/bin/cat $packagesqueryfile); do for installed_pack in $(/usr/bin/cat $packagesqueryfile); do
if [ $pack = $dep ]; then if [ $installed_pack = $dep ]; then
have=yes have=yes
break break
fi fi
done done
if [ "$have" = "false" ]; then if [ "$have" = "false" ]; then
pkgnow=$packagename missing_deps="$missing_deps $dep"
add "" $dep
unpack $cachedpkgdir/$pkgnow.gz
return
fi fi
done 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 mv -v deps $installedpackagesdir/$packagename &> /dev/null
fi fi
mkdir $installedpackagesdir/$packagename &> /dev/null mkdir -p $installedpackagesdir/$packagename &> /dev/null
mv -v list $installedpackagesdir/$packagename &> /dev/null mv -v list $installedpackagesdir/$packagename &> /dev/null
[ -f pre_delete ] \ if [ -f pre_delete ]; then
&& mv -v pre_delete $installedpackagesdir/$packagename &> /dev/null mv -v pre_delete $installedpackagesdir/$packagename &> /dev/null
[ -f post_delete ] \ fi
&& mv -v post_delete $installedpackagesdir/$packagename &> /dev/null if [ -f post_delete ]; then
mv -v post_delete $installedpackagesdir/$packagename &> /dev/null
fi
cp -r ./* $rootdir/ cp -r ./* $rootdir/
[ -f $rootdir/post_install ] \ if [ -f $rootdir/post_install ]; then
&& rm $rootdir/post_install mv -v $rootdir/post_install $installedpackagesdir/$packagename &> /dev/null
[ -f $rootdir/tmp/$packagename/post_install ] \ fi
&& printf "${YELLOW}**${GREEN} post_install script ${packagename%.pkg*}\n${RESET}" \ if [ -f $rootdir/tmp/$packagename/post_install ]; then
&& /usr/bin/sh -c $rootdir/tmp/$packagename/post_install &> /dev/null printf "${YELLOW}**${GREEN} post_install script ${packagename%.pkg*}\n${RESET}"
[[ "$installed" == "false" ]] \ /usr/bin/sh -c $rootdir/tmp/$packagename/post_install &> /dev/null
&& echo ${packagename%.pkg*} >> $packagesqueryfile fi
if [[ "$installed" == "false" ]]; then
echo ${packagename%.pkg*} >> $packagesqueryfile
fi
rm -rv $rootdir/tmp/$packagename &> /dev/null rm -rv $rootdir/tmp/$packagename &> /dev/null
printf "${YELLOW}**${GREEN} Installed ${packagename%.pkg*} successful\n${RESET}" printf "${YELLOW}**${GREEN} Installed ${packagename%.pkg*} successful\n${RESET}"
cd - &> /dev/null cd - &> /dev/null