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 # resolve relative pkg_path
PKG_PATH="$(resolve_path "$PKG_PATH" "$config_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 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 config_path=/etc/zpkg
fname="$(basename "$0")" fname="$(basename "$0")"
ALLOW_ROOT=false
UPDATE_REMOVE=true

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -14,6 +14,7 @@ to_delete()
# $1 = package , $2 = prefix # $1 = package , $2 = prefix
upgrade_package() upgrade_package()
{ {
[ "$1" = "$fname" ] && [ -z "$opt_R" ] && _self_update=y && return 0
echo "Updating $1" echo "Updating $1"
tmpdir="/tmp/zpkg_$(random_string 5)" tmpdir="/tmp/zpkg_$(random_string 5)"
mkdir -p "$tmpdir" mkdir -p "$tmpdir"
@ -36,3 +37,15 @@ upgrade_package()
rm -rd "$tmpdir" 2>/dev/null rm -rd "$tmpdir" 2>/dev/null
return $ret 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() deps()
{ {
(
cd "$PKG_PATH" cd "$PKG_PATH"
l=$(grep "^$1 " pkglist) || return $? l=$(grep "^$1 " pkglist) || return $?
echo "$l" | cut -d' ' -f3- echo "$l" | cut -d' ' -f3-
)
} }
# $1 = pkg file # $1 = pkg file
@ -15,6 +17,7 @@ desc() {
resolve_packages() resolve_packages()
{ {
RET=0 RET=0
(
cd "$PKG_PATH" cd "$PKG_PATH"
for I in $* for I in $*
do do
@ -27,6 +30,7 @@ resolve_packages()
fi fi
done done
return $RET return $RET
)
} }
# env: INCLUDE_PACKAGES # env: INCLUDE_PACKAGES
@ -45,9 +49,10 @@ resolve_deps()
is_installed() is_installed()
{ {
(
cd "$PKG_PATH" cd "$PKG_PATH"
grep -q "^$1 " installed 2>/dev/null grep -q "^$1 " installed 2>/dev/null
return $? )
} }
# $1 = file # $1 = file
@ -58,11 +63,12 @@ view_package_file() {
# $1 = package name # $1 = package name
view_package() { view_package() {
cd "$PKG_PATH" && view_package_file "$1.tar.$extension" ( cd "$PKG_PATH" && view_package_file "$1.tar.$extension" )
} }
removed_packages() removed_packages()
{ {
(
cd "$PKG_PATH" cd "$PKG_PATH"
cat installed 2>/dev/null | while read -r in cat installed 2>/dev/null | while read -r in
do do
@ -70,10 +76,12 @@ removed_packages()
rem=$(grep "^$name " pkglist | awk '{print $2}') rem=$(grep "^$name " pkglist | awk '{print $2}')
[ -z "$rem" ] && echo $name [ -z "$rem" ] && echo $name
done done
)
} }
outdated_packages() outdated_packages()
{ {
(
cd "$PKG_PATH" cd "$PKG_PATH"
cat installed 2>/dev/null | while read -r in cat installed 2>/dev/null | while read -r in
do do
@ -82,4 +90,5 @@ outdated_packages()
rem=$(grep "^$name " pkglist | awk '{print $2}') rem=$(grep "^$name " pkglist | awk '{print $2}')
[ -n "$rem" ] && [ "$loc" -lt "$rem" ] && echo $name [ -n "$rem" ] && [ "$loc" -lt "$rem" ] && echo $name
done done
)
} }