diff --git a/README.md b/README.md index a0def97..40f9d13 100644 --- a/README.md +++ b/README.md @@ -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.
+Files are named `ORDER_OPERATION` or `ORDER_OPERATION_user`, for example: `pre_install`, `post_upgrade_user`.
+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 diff --git a/src/deploy.sh b/src/deploy.sh index ef74cb1..87e9883 100644 --- a/src/deploy.sh +++ b/src/deploy.sh @@ -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 diff --git a/src/hooks.sh b/src/hooks.sh new file mode 100644 index 0000000..b686be4 --- /dev/null +++ b/src/hooks.sh @@ -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 + ) +} diff --git a/src/install.sh b/src/install.sh index 39a559b..b567705 100644 --- a/src/install.sh +++ b/src/install.sh @@ -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 } diff --git a/src/remove.sh b/src/remove.sh index 1b2c3a6..23e9af8 100644 --- a/src/remove.sh +++ b/src/remove.sh @@ -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 } diff --git a/src/upgrade.sh b/src/upgrade.sh index ca4eb0d..551048c 100644 --- a/src/upgrade.sh +++ b/src/upgrade.sh @@ -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 }