feat: add hooks

This commit is contained in:
zawz 2022-02-03 15:14:18 +01:00
parent b789f89d12
commit fd2f0a989a
6 changed files with 68 additions and 15 deletions

View file

@ -67,6 +67,9 @@ You need to be able to SSH to the zpkg user, SSH keys are recommended
.
+-- DEPS
+-- DESC
+-- HOOKS
| +-- pre_install
| +-- ...
+-- ROOT
| +-- /
+-- HOME
@ -76,6 +79,23 @@ You need to be able to SSH to the zpkg user, SSH keys are recommended
- The HOME directory represents the home directory of the user
- The DEPS file contains dependency packages separated by spaces or newlines. Dependencies are package names from the repository
- The DESC file contains the description of the package
- The HOOKS directory contains hooks to run on certain operations.
#### Hooks
Hooks are executable files that are run at some points during processing. <br>
Files are named `ORDER_OPERATION` or `ORDER_OPERATION_user`, for example: `pre_install`, `post_upgrade_user`. <br>
The `_user` file is executed as user while original is executed as root.
Supported hooks:
- pre_install
- post_install
- pre_upgrade
- post_upgrade
- pre_remove
- post_remove
> Suffix with `_user` to run as user
### Deploying packages

View file

@ -8,7 +8,7 @@ package()
pkg="$2"
unset tmpdir
if [ ! -d "$src/ROOT" ] && [ ! -d "$src/HOME" ] && [ ! -f "$src/DEPS" ] && [ ! -f "$src/DESC" ]
if [ ! -d "$src/ROOT" ] && [ ! -d "$src/HOME" ] && [ ! -f "$src/DEPS" ] && [ ! -f "$src/DESC" ] && [ ! -d "$src/HOOKS" ]
then
tmpdir="$TMPDIR/zpkg_$(random_string 5)"
mkdir -p "$tmpdir"
@ -22,6 +22,7 @@ package()
[ -f DESC ] && list="$list DESC"
[ -d HOME ] && list="$list HOME"
[ -d ROOT ] && list="$list ROOT"
[ -d HOOKS ] && list="$list HOOKS"
size=$(du -sb $list | awk '{print $1}' | paste -sd+ | bc)
echo "Packaging $(basename "$pkg"): $(echo "$size" | numfmt --to=iec-i)B"
cc=$compress

16
src/hooks.sh Normal file
View file

@ -0,0 +1,16 @@
#!/bin/sh
# $1 = op , $2 = pre/post , $3 = sudo prefix
hook() {
(
set -e
cd HOOKS 2>/dev/null || return 0
file=${2}_${1}
if [ -x "$file" ] ; then
$3 "./$file"
fi
if [ -x "${file}_user" ] ; then
"./${file}_user"
fi
)
}

View file

@ -1,10 +1,10 @@
#!/bin/sh
# $1 = file , $2 = prefix
# $1 = file , $2 = prefix , $3 = target to extract
unpack()
{
echo "Unpacking $1"
$pcompress -dc < "$1" 2>/dev/null | tar -xf -
$pcompress -dc < "$1" 2>/dev/null | tar -xf - $3
}
# $1 = package , $2 = prefix
@ -43,13 +43,15 @@ install_package()
(
umask a+rx
unpack "$1.tar.$extension" $2 || return $?
hook install pre $2
[ -d "ROOT" ] || return 0
copy_files ROOT "$ROOT_PATH/" $2 2>/dev/null || return $?
) || return $?
copy_files HOME "$HOME" 2>/dev/null
add_package_entry "$1" $2
hook install post $2
)
ret=$?
rm -r "$tmpdir" 2>/dev/null
rm -rf "$tmpdir" 2>/dev/null
return $ret
}

View file

@ -11,21 +11,31 @@ delete_files()
# $1 = package , $2 = prefix
remove_package()
{
(
cd "$PKG_PATH"
archive="$(pwd)/$1.tar.$extension"
if [ ! -f "$archive" ] || ! grep -q "^$1 " installed
archive="$PKG_PATH/$1.tar.$extension"
if [ ! -f "$archive" ] || ! grep -q "^$1 " "$PKG_PATH/installed"
then
echo "Package '$1' not installed" >&2
return 1
fi
echo "Removing $1"
list=$(cat "$archive" | $pcompress -dc 2>/dev/null | tar -tf - 2>/dev/null)
echo "$list" | grep "^ROOT/" | sed 's|^ROOT/||g' | tac | delete_files "$ROOT_PATH/" $2
echo "$list" | grep "^HOME/" | sed 's|^HOME/||g' | tac | delete_files "$HOME"
tmpdir="$TMPDIR/zpkg_$(random_string 5)"
mkdir -p "$tmpdir"
(
cd "$tmpdir" || exit $?
echo "Removing $1"
$2 rm "$archive" 2>/dev/null
$2 sed -i "/^$1 /d" installed
unpack "$archive" $2 HOOKS >/dev/null 2>&1 || true
hook remove pre $2
list=$(cat "$archive" | $pcompress -dc 2>/dev/null | tar -tf - 2>/dev/null)
echo "$list" | grep "^ROOT/" | sed 's|^ROOT/||g' | tac | delete_files "$ROOT_PATH/" $2
echo "$list" | grep "^HOME/" | sed 's|^HOME/||g' | tac | delete_files "$HOME"
$2 rm "$archive" 2>/dev/null
$2 sed -i "/^$1 /d" "$PKG_PATH/installed"
hook remove post $2
)
ret=$?
rm -rf "$tmpdir" 2>/dev/null
}

View file

@ -24,6 +24,8 @@ upgrade_package()
fetch_package "$1" || { echo "Package '$1' not found" >&2 && return 1; }
unpack "$1.tar.$extension" || return $?
hook upgrade pre $2
oldlist=$(cat "$PKG_PATH/$1.tar.$extension" | $pcompress -dc 2>/dev/null | tar -tf - 2>/dev/null | sort)
echo "$oldlist" | grep "^ROOT/" | to_delete - ROOT | sed 's|^ROOT/||g' | tac | delete_files "$ROOT_PATH/" $2
echo "$oldlist" | grep "^HOME/" | to_delete - HOME | sed 's|^HOME/||g' | tac | delete_files "$HOME"
@ -33,9 +35,11 @@ upgrade_package()
$2 cp "$1.tar.$extension" "$PKG_PATH"
$2 chmod a+r "$PKG_PATH/$1.tar.$extension"
add_package_entry "$1" $2
hook upgrade post $2
)
ret=$?
rm -r "$tmpdir" 2>/dev/null
rm -rf "$tmpdir" 2>/dev/null
return $ret
}