Implement self-upgrading mitigation

This commit is contained in:
zawz 2020-07-02 12:04:57 +02:00
parent b471059972
commit b558f5f0b4
10 changed files with 41 additions and 20 deletions

View file

@ -28,7 +28,6 @@ fi
# resolve relative pkg_path
PKG_PATH="$(resolve_path "$PKG_PATH" "$config_path")"
[ -z "$UPDATE_REMOVE" ] && UPDATE_REMOVE=true
root_check && [ -z "$opt_f" ] && [ "$ALLOW_ROOT" != "true" ] && echo "Cannot run as root" >&2 && exit 10

View file

@ -2,3 +2,5 @@
config_path=/etc/zpkg
fname="$(basename "$0")"
ALLOW_ROOT=false
UPDATE_REMOVE=true

View file

@ -11,6 +11,7 @@ fetch_package()
# $1 = prefix
fetch_pkglist()
{
(
cd "$PKG_PATH"
$1 mv pkglist pkglist_bak 2>/dev/null
if ! $1 wget "$HTTP_ADDRESS/pkglist" -q --show-progress -O pkglist 2>&1
@ -22,4 +23,5 @@ fetch_pkglist()
$1 rm pkglist_bak 2>/dev/null
return 0
fi
)
}

View file

@ -28,6 +28,7 @@ copy_files() {
# $1 = package , $2 = prefix
install_package()
{
[ "$1" = "$fname" ] && [ -z "$opt_R" ] && _self_update=y && return 0
echo "Installing $1"
tmpdir="/tmp/zpkg_$(random_string 5)"
mkdir -p "$tmpdir"

View file

@ -132,3 +132,5 @@ deploy)
;;
*) usage && exit 1 ;;
esac
[ -n "$_self_update" ] && gen_self_update && exec "$_tmpzpkg" -R install zpkg

View file

@ -1,25 +1,15 @@
#!/bin/sh
unset opt_f
unset opt_f opt_R
while getopts ":hc:f" opt;
while getopts ":hc:fR" opt;
do
case $opt in
h)
usage
exit 0
;;
c)
config_path="$OPTARG"
;;
f)
opt_f="y"
;;
\?)
echo "Uknown option: $OPTARG"
usage
exit 1
;;
h) usage ; exit 1 ;;
c) config_path="$OPTARG" ;;
f) opt_f=y ;;
R) opt_R=y ;;
\?) echo "Uknown option: $OPTARG" ; usage ; exit 1 ;;
esac
done

View file

@ -24,6 +24,7 @@ Options:
-h Display this help
-c <path> Custom config path. Default /etc/zpkg
-f Force running when root
-R Don't do self-update mitigation
Config (zpkg.conf):
SSH_ADDRESS SSH access for deploy

View file

@ -11,6 +11,7 @@ delete_files()
# $1 = package , $2 = prefix
remove_package()
{
(
cd "$PKG_PATH"
archive="$(pwd)/$1.tar.$extension"
if [ ! -f "$archive" ] || ! grep -q "^$1 " installed
@ -26,4 +27,5 @@ remove_package()
$2 rm "$archive" 2>/dev/null
$2 sed -i "/^$1 /d" installed
)
}

View file

@ -14,6 +14,7 @@ to_delete()
# $1 = package , $2 = prefix
upgrade_package()
{
[ "$1" = "$fname" ] && [ -z "$opt_R" ] && _self_update=y && return 0
echo "Updating $1"
tmpdir="/tmp/zpkg_$(random_string 5)"
mkdir -p "$tmpdir"
@ -36,3 +37,15 @@ upgrade_package()
rm -rd "$tmpdir" 2>/dev/null
return $ret
}
## self upgrading mitigation
unset _self_update
_tmpzpkg="/tmp/zpkg_bin_$(random_string 5)"
gen_self_update()
{
# copy current file
cp "$0" "$_tmpzpkg" || return $?
# make new script self-delete
echo 'rm -f "$0"' >> "$_tmpzpkg"
}

View file

@ -2,9 +2,11 @@
deps()
{
(
cd "$PKG_PATH"
l=$(grep "^$1 " pkglist) || return $?
echo "$l" | cut -d' ' -f3-
)
}
# $1 = pkg file
@ -15,6 +17,7 @@ desc() {
resolve_packages()
{
RET=0
(
cd "$PKG_PATH"
for I in $*
do
@ -27,6 +30,7 @@ resolve_packages()
fi
done
return $RET
)
}
# env: INCLUDE_PACKAGES
@ -45,9 +49,10 @@ resolve_deps()
is_installed()
{
(
cd "$PKG_PATH"
grep -q "^$1 " installed 2>/dev/null
return $?
)
}
# $1 = file
@ -58,11 +63,12 @@ view_package_file() {
# $1 = package name
view_package() {
cd "$PKG_PATH" && view_package_file "$1.tar.$extension"
( cd "$PKG_PATH" && view_package_file "$1.tar.$extension" )
}
removed_packages()
{
(
cd "$PKG_PATH"
cat installed 2>/dev/null | while read -r in
do
@ -70,10 +76,12 @@ removed_packages()
rem=$(grep "^$name " pkglist | awk '{print $2}')
[ -z "$rem" ] && echo $name
done
)
}
outdated_packages()
{
(
cd "$PKG_PATH"
cat installed 2>/dev/null | while read -r in
do
@ -82,4 +90,5 @@ outdated_packages()
rem=$(grep "^$name " pkglist | awk '{print $2}')
[ -n "$rem" ] && [ "$loc" -lt "$rem" ] && echo $name
done
)
}