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
}