This commit is contained in:
wt
2025-09-30 18:02:31 +07:00
parent a8c4a287eb
commit 755df2c2c1
+108 -52
View File
@@ -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