441 lines
13 KiB
Bash
Executable File
441 lines
13 KiB
Bash
Executable File
#!/bin/sh
|
|
# Glacier - manage installed packages on a Linux system
|
|
#
|
|
# This file is part of Glacier.
|
|
#
|
|
# Glacier is free software: you can redistribute it
|
|
# and/or modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation, either version 3
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# Glacier is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
# See the GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Glacier. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
source /etc/glacier/hooks
|
|
|
|
get_pkg() {
|
|
printf "$blue[ i ]$reset Downloading archive for package '$2'...\n"
|
|
$GLACIER_DOWNLOAD_BACKEND $GREPO1/$2.tar.gz || $GLACIER_DOWNLOAD_BACKEND $GREPO2/$2.tar.gz || $GLACIER_DOWNLOAD_BACKEND $GREPO3/$2.tar.gz || $GLACIER_DOWNLOAD_BACKEND $GREPO4/$2.tar.gz || $GLACIER_DOWNLOAD_BACKEND $GREPO5/$2.tar.gz || $GLACIER_DOWNLOAD_BACKEND $GREPO6/$2.tar.gz || $GLACIER_DOWNLOAD_BACKEND $GREPO7/$2.tar.gz || $GLACIER_DOWNLOAD_BACKEND $GREPO8/$2.tar.gz
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Package '$2' not found.\n"
|
|
exit 1
|
|
fi
|
|
$GLACIER_DOWNLOAD_BACKEND $GREPO1/$2.checksum || $GLACIER_DOWNLOAD_BACKEND $GREPO2/$2.checksum || $GLACIER_DOWNLOAD_BACKEND $GREPO3/$2.checksum || $GLACIER_DOWNLOAD_BACKEND $GREPO4/$2.checksum || $GLACIER_DOWNLOAD_BACKEND $GREPO5/$2.checksum || $GLACIER_DOWNLOAD_BACKEND $GREPO6/$2.checksum || $GLACIER_DOWNLOAD_BACKEND $GREPO7/$2.checksum || $GLACIER_DOWNLOAD_BACKEND $GREPO8/$2.tar.gz
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Package checksum not found.\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
int_check() {
|
|
if [ "$GLACIER_DO_INT_CHECK" = "true" ]; then
|
|
printf "$blue[ i ]$reset Checking package integrity...\n"
|
|
mv *.checksum local_sum
|
|
sha256sum *.tar.gz > pkg_sum
|
|
/usr/bin/glacier-integrity-check local_sum pkg_sum
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Integrity check failed.\n"
|
|
exit 1
|
|
fi
|
|
printf "$green[ $check ]$reset Integrity check passed.\n"
|
|
else
|
|
printf "$yellow[ ! ]$reset Skipping integrity check...\n"
|
|
fi
|
|
}
|
|
|
|
unpack_pkg() {
|
|
printf "$blue[ i ]$reset Unpacking $2.tar.gz...\n"
|
|
mkdir $2 && mv $2.tar.gz $2 && cd $2
|
|
pv $2.tar.gz | tar -xz
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Could not unpack $2.tar.gz.\n"
|
|
cd .. && rm -rf $2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
installpkg() {
|
|
printf "$blue[ i ]$reset Installing $2...\n"
|
|
sleep 1
|
|
chmod +x *
|
|
./INSTALL.sh
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Failed to update $2.\n"
|
|
cd .. && rm -rf $2
|
|
exit 1
|
|
fi
|
|
./$2.ts.sh
|
|
mv $2-pkginfo.json /etc/glacier/pkginfo
|
|
}
|
|
|
|
updatepkg() {
|
|
printf "$blue[ i ]$reset Updating $2...\n"
|
|
sleep 1
|
|
chmod +x *
|
|
./UPDATE.sh
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Failed to update $2.\n"
|
|
cd .. && rm -rf $2
|
|
exit 1
|
|
fi
|
|
./$2.ts.sh
|
|
}
|
|
|
|
removepkg() {
|
|
printf "$blue[ i ]$reset Removing $2...\n"
|
|
sleep 1
|
|
chmod +x *
|
|
/etc/glacier/pkginfo/$2.remove
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Failed to remove $2.\n"
|
|
cd .. && rm -rf $2
|
|
exit 1
|
|
fi
|
|
rm /var/log/glacier/$2.timestamp
|
|
rm /etc/glacier/pkginfo/$2-pkginfo.json
|
|
}
|
|
|
|
installpkg_from_cache() {
|
|
printf "$blue[ i ]$reset Installing $2 from cache...\n"
|
|
sleep 1
|
|
cd /var/cache/glacier && cp $2.tar.gz /tmp && cd /tmp
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Package does not exist in cache.\n"
|
|
exit 1
|
|
fi
|
|
unpack_pkg
|
|
install_pkg
|
|
}
|
|
|
|
clear_cache() {
|
|
printf "$blue[ i ]$reset Clearing cache...\n"
|
|
sleep 1
|
|
cd /var/cache/glacier && rm -rvf *
|
|
if [ "$?" != "0" ]; then
|
|
printf "$red[ $error ]$reset Some items could not be cleared.\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
#
|
|
# Show Glacier debugging info
|
|
#
|
|
|
|
debug_info() {
|
|
printf "$blue>> Glacier v3.2.1$reset\n"
|
|
printf ">> Checking for valid download backend...\n"
|
|
whereis wget
|
|
whereis curl
|
|
whereis aria2c
|
|
printf ">> Checking which download backend is in use...\n"
|
|
echo $GLACIER_DOWNLOAD_BACKEND
|
|
printf ">> Checking if all Glacier files are present...\n"
|
|
whereis glacier glacier.conf make.conf
|
|
ls /var/log | grep glacier
|
|
ls /var/cache | grep glacier
|
|
printf ">> If any files are missing, Glacier will not behave properly.\n"
|
|
printf ">> Checking if terminal can output unicode symbols...\n"
|
|
printf "$check\n"
|
|
printf "$error\n"
|
|
printf "$warning\n"
|
|
printf "$question\n"
|
|
printf "$red Red.$reset\n"
|
|
printf "$green Green.$reset\n"
|
|
printf "$yellow Yellow.$reset\n"
|
|
printf "$blue Blue.$reset\n"
|
|
printf "NOTE: If you use a custom colorscheme, colors will not match.\n"
|
|
printf ">> Checking if repositories are valid...\n"
|
|
echo $GREPO1
|
|
echo $GREPO2
|
|
echo $GREPO3
|
|
echo $GREPO4
|
|
echo $GREPO5
|
|
echo $GREPO6
|
|
echo $GREPO7
|
|
echo $GREPO8
|
|
printf ">> Checking which shell is in use...\n"
|
|
which $SHELL
|
|
printf "NOTE: If you use zsh, a percentage symbol may appear after some lines.\n"
|
|
printf ">> Gathered debug information.\n"
|
|
printf ">> To save this information to a file, run:\n"
|
|
printf ">> $ glacier --debuginfo > glacier.debug\n"
|
|
}
|
|
|
|
#
|
|
# Parses JSON from pkginfo files and outputs it
|
|
#
|
|
|
|
query() {
|
|
printf "$blue[ i ]$reset Showing information for package '$2'.\n"
|
|
printf "$blue>> Package name:$reset " && cat /etc/glacier/pkginfo/$2-pkginfo.json | jq .package_name
|
|
printf "$blue>> Package version:$reset " && cat /etc/glacier/pkginfo/$2-pkginfo.json | jq .package_version
|
|
printf "$blue>> Package description:$reset " && cat /etc/glacier/pkginfo/$2-pkginfo.json | jq .package_description
|
|
printf "$blue>> Source tree size:$reset " && cat /etc/glacier/pkginfo/$2-pkginfo.json | jq .src_tree_size
|
|
printf "$blue>> Size of installed files:$reset " && cat /etc/glacier/pkginfo/$2-pkginfo.json | jq .exec_size
|
|
printf "$blue>> License:$reset " && cat /etc/glacier/pkginfo/$2-pkginfo.json | jq .license
|
|
printf "$blue>> Installation date:$reset " && cat /var/log/glacier/$2.timestamp
|
|
}
|
|
|
|
#
|
|
# Will either keep removal script, update it with a new one, or delete it alltogether
|
|
#
|
|
|
|
cleanup_keep_rm () {
|
|
printf "$blue[ i ]$reset Cleaning up...\n"
|
|
mv REMOVE.sh /etc/glacier/pkginfo/$2.remove
|
|
cd .. && rm -rf *.checksum *.tar.* $2
|
|
}
|
|
|
|
cleanup_update_rm () {
|
|
printf "$blue[ i ]$reset Cleaning up...\n"
|
|
rm /etc/glacier/pkginfo/$2.remove
|
|
mv REMOVE.sh /etc/glacier/pkginfo/$2.remove
|
|
cd .. && rm -rf *.checksum *.tar.* $2
|
|
}
|
|
|
|
cleanup_del_rm () {
|
|
printf "$blue[ i ]$reset Cleaning up...\n"
|
|
rm /etc/glacier/pkginfo/$2.remove
|
|
cd .. && rm -rf *.checksum *.tar.* $2
|
|
}
|
|
|
|
#
|
|
# Execute pre and posr hooks from files
|
|
#
|
|
|
|
pre_hooks() {
|
|
source /etc/glacier/hooks
|
|
}
|
|
|
|
pre_op_hooks() {
|
|
printf "$blue[ i ]$reset Executing pre-operation hooks...\n"
|
|
/etc/glacier/pre-hooks
|
|
}
|
|
|
|
post_hooks () {
|
|
printf "$blue[ i ]$reset Executing post-operation hooks...\n"
|
|
/etc/glacier/post-hooks
|
|
}
|
|
|
|
case $1 in
|
|
-h|--help)
|
|
printf "$blue[ * ] Glacier - Manage installed packages on the system$reset\n"
|
|
printf "usage: glacier [-f] [-u] [-x] [-q] [-c] [-ci] [-cc] [--debuginfo]\n"
|
|
printf "\n"
|
|
printf "$blue=== Information ===$reset\n"
|
|
printf "glacier {-h/--help} - Show this message and exit\n"
|
|
printf "glacier {-v/--version} - Show the version and exit\n"
|
|
printf "\n"
|
|
printf "$blue=== Operations ===$reset\n"
|
|
printf "glacier {-f/install} - Install a new package\n"
|
|
printf "glacier {-u/update} - Update an installed package\n"
|
|
printf "glacier {-x/remove} - Remove an installed package\n"
|
|
printf "glacier {-q/query} - Query an installed package\n"
|
|
printf "glacier {-c/cache} - Download a package to the cache\n"
|
|
printf "glacier {-ci/cache-install} - Install a package from the cache\n"
|
|
printf "glacier {-cc/cache-clear} - Clear the cache\n"
|
|
printf "\n"
|
|
printf "$blue=== Debugging ===$reset\n"
|
|
printf "glacier {--debuginfo} - Show debugging information\n"
|
|
printf "\n"
|
|
printf "$blue=== Licensing ===$reset\n"
|
|
printf "This program is free software: you can redistribute it and/or modify it\n"
|
|
printf "under the terms of the GNU General Public License as published by the\n"
|
|
printf "Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n"
|
|
exit 0
|
|
;;
|
|
-v|--version)
|
|
printf "${blue}Glacier v3.2.1${reset}\n"
|
|
exit 0
|
|
;;
|
|
-f|install)
|
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
|
printf "$red[ $error ]$reset Please run Glacier as root.\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$2" == "" ]; then
|
|
printf "$red[ $error ]$reset No package name was supplied.\n"
|
|
exit 1
|
|
fi
|
|
|
|
printf "$blue[ i ]$reset Installing package '$2'.\n"
|
|
read -p "$(printf "$blue[ ? ]$reset Proceed with this operation? (y/n) ")" -n 1 -r
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
cd /opt/glacier/workspace
|
|
printf "\n"
|
|
pre_hooks "$@"
|
|
get_pkg "$@"
|
|
int_check "$@"
|
|
unpack_pkg "$@"
|
|
pre_op_hooks "$@"
|
|
installpkg "$@"
|
|
post_hooks "$@"
|
|
cleanup_keep_rm "$@"
|
|
printf "$green[ $check ]$reset Operation completed.\n"
|
|
exit 0
|
|
elif [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
printf "\n"
|
|
printf "${red}[ $error ]${reset} Aborting.\n"
|
|
exit 1
|
|
fi
|
|
;;
|
|
-u|update)
|
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
|
printf "$red[ $error ]$reset Please run Glacier as root.\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$2" == "" ]; then
|
|
printf "$red[ $error ]$reset No package name was supplied.\n"
|
|
exit 1
|
|
fi
|
|
|
|
printf "$blue[ i ]$reset Updating package '$2'.\n"
|
|
read -p "$(printf "$blue[ ? ]$reset Proceed with this operation? (y/n) ")" -n 1 -r
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
cd /opt/glacier/workspace
|
|
printf "\n"
|
|
pre_hooks "$@"
|
|
get_pkg "$@"
|
|
int_check "$@"
|
|
unpack_pkg "$@"
|
|
pre_op_hooks "$@"
|
|
updatepkg "$@"
|
|
post_hooks "$@"
|
|
cleanup_update_rm "$@"
|
|
printf "$green[ $check ]$reset Operation completed.\n"
|
|
exit 0
|
|
elif [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
printf "\n"
|
|
printf "${red}[ $error ]${reset} Aborting.\n"
|
|
exit 1
|
|
fi
|
|
;;
|
|
-x|remove)
|
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
|
printf "$red[ $error ]$reset Please run Glacier as root.\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$2" == "" ]; then
|
|
printf "$red[ $error ]$reset No package name was supplied.\n"
|
|
exit 1
|
|
fi
|
|
|
|
printf "$blue[ i ]$reset Removing package '$2'.\n"
|
|
read -p "$(printf "$blue[ ? ]$reset Proceed with this operation? (y/n) ")" -n 1 -r
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
cd /opt/glacier/workspace
|
|
printf "\n"
|
|
pre_hooks "$@"
|
|
removepkg "$@"
|
|
post_hooks "$@"
|
|
cleanup_del_rm "$@"
|
|
printf "$green[ $check ]$reset Operation completed.\n"
|
|
exit 0
|
|
elif [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
printf "\n"
|
|
printf "${red}[ $error ]${reset} Aborting.\n"
|
|
exit 1
|
|
fi
|
|
;;
|
|
-q|query)
|
|
if [ "$2" == "" ]; then
|
|
printf "$red[ $error ]$reset No package name was supplied.\n"
|
|
exit 1
|
|
fi
|
|
|
|
query "$@"
|
|
exit 0
|
|
;;
|
|
-c|cache)
|
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
|
printf "$red[ $error ]$reset Please run Glacier as root.\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$2" == "" ]; then
|
|
printf "$red[ $error ]$reset No package name was supplied.\n"
|
|
exit 1
|
|
fi
|
|
|
|
printf "$blue[ i ]$reset Caching package '$2'.\n"
|
|
read -p "$(printf "$blue[ ? ]$reset Proceed with this operation? (y/n) ")" -n 1 -r
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
cd /var/cache/glacier
|
|
printf "\n"
|
|
get_pkg "$@"
|
|
int_check "$@"
|
|
printf "$green[ $check ]$reset Operation completed.\n"
|
|
exit 0
|
|
elif [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
printf "\n"
|
|
printf "${red}[ $error ]${reset} Aborting.\n"
|
|
exit 1
|
|
fi
|
|
;;
|
|
-ci|cache-install)
|
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
|
printf "$red[ $error ]$reset Please run Glacier as root.\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$2" == "" ]; then
|
|
printf "$red[ $error ]$reset No package name was supplied.\n"
|
|
exit 1
|
|
fi
|
|
|
|
printf "$blue[ i ]$reset Installing package '$2' from cache.\n"
|
|
read -p "$(printf "$blue[ ? ]$reset Proceed with this operation? (y/n) ")" -n 1 -r
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
cd /var/cache/glacier
|
|
mv $2.tar.gz /opt/glacier/workspace
|
|
cd /opt/glacier/workspace
|
|
printf "\n"
|
|
pre_hooks "$@"
|
|
unpack_pkg "$@"
|
|
pre_op_hooks "$@"
|
|
installpkg "$@"
|
|
post_hooks "$@"
|
|
cleanup_keep_rm "$@"
|
|
printf "$green[ $check ]$reset Operation completed.\n"
|
|
exit 0
|
|
elif [[ $REPLY =~ ^[Nn]$ ]]; then
|
|
printf "\n"
|
|
printf "${red}[ $error ]${reset} Aborting.\n"
|
|
exit 1
|
|
fi
|
|
;;
|
|
-cc|cache-clear)
|
|
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
|
printf "$red[ $error ]$reset Please run Glacier as root.\n"
|
|
exit 1
|
|
fi
|
|
|
|
clear_cache "$@"
|
|
printf "$green[ $check ]$reset Operation completed.\n"
|
|
exit 0
|
|
;;
|
|
--debuginfo)
|
|
debug_info "$@"
|
|
exit 0
|
|
;;
|
|
-*|--*)
|
|
printf "$red[ $error ]$reset Unknown option, see 'glacier -h' for usage.\n"
|
|
exit 1
|
|
;;
|
|
*)
|
|
printf "$red[ $error ]$reset Unknown option, see 'glacier -h' for usage.\n"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
printf "$red[ $error ]$reset Unknown option, see 'glacier -h' for usage.\n"
|
|
exit 1
|