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 +-- DEPS
+-- DESC +-- DESC
+-- HOOKS
| +-- pre_install
| +-- ...
+-- ROOT +-- ROOT
| +-- / | +-- /
+-- HOME +-- 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 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 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 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 ### Deploying packages

View file

@ -8,7 +8,7 @@ package()
pkg="$2" pkg="$2"
unset tmpdir 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 then
tmpdir="$TMPDIR/zpkg_$(random_string 5)" tmpdir="$TMPDIR/zpkg_$(random_string 5)"
mkdir -p "$tmpdir" mkdir -p "$tmpdir"
@ -22,6 +22,7 @@ package()
[ -f DESC ] && list="$list DESC" [ -f DESC ] && list="$list DESC"
[ -d HOME ] && list="$list HOME" [ -d HOME ] && list="$list HOME"
[ -d ROOT ] && list="$list ROOT" [ -d ROOT ] && list="$list ROOT"
[ -d HOOKS ] && list="$list HOOKS"
size=$(du -sb $list | awk '{print $1}' | paste -sd+ | bc) size=$(du -sb $list | awk '{print $1}' | paste -sd+ | bc)
echo "Packaging $(basename "$pkg"): $(echo "$size" | numfmt --to=iec-i)B" echo "Packaging $(basename "$pkg"): $(echo "$size" | numfmt --to=iec-i)B"
cc=$compress 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 #!/bin/sh
# $1 = file , $2 = prefix # $1 = file , $2 = prefix , $3 = target to extract
unpack() unpack()
{ {
echo "Unpacking $1" echo "Unpacking $1"
$pcompress -dc < "$1" 2>/dev/null | tar -xf - $pcompress -dc < "$1" 2>/dev/null | tar -xf - $3
} }
# $1 = package , $2 = prefix # $1 = package , $2 = prefix
@ -43,13 +43,15 @@ install_package()
( (
umask a+rx umask a+rx
unpack "$1.tar.$extension" $2 || return $? unpack "$1.tar.$extension" $2 || return $?
hook install pre $2
[ -d "ROOT" ] || return 0 [ -d "ROOT" ] || return 0
copy_files ROOT "$ROOT_PATH/" $2 2>/dev/null || return $? copy_files ROOT "$ROOT_PATH/" $2 2>/dev/null || return $?
) || return $? ) || return $?
copy_files HOME "$HOME" 2>/dev/null copy_files HOME "$HOME" 2>/dev/null
add_package_entry "$1" $2 add_package_entry "$1" $2
hook install post $2
) )
ret=$? ret=$?
rm -r "$tmpdir" 2>/dev/null rm -rf "$tmpdir" 2>/dev/null
return $ret return $ret
} }

View file

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