add iglu.sh rewrite
This commit is contained in:
parent
3c57204221
commit
c193e1a7ee
1 changed files with 100 additions and 0 deletions
100
iglu.sh
Executable file
100
iglu.sh
Executable file
|
@ -0,0 +1,100 @@
|
|||
#!/bin/sh
|
||||
# usage: iglu [ add | del ] <pkg>
|
||||
#
|
||||
# WONTFIX:
|
||||
# - circular deps shall not be handled
|
||||
|
||||
set -e
|
||||
|
||||
usage() {
|
||||
echo "usage: $(basename $0) [add | del] <pkg>"
|
||||
exit 1
|
||||
}
|
||||
|
||||
fatal() {
|
||||
echo "ERROR: $@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo "WARNING: $@"
|
||||
}
|
||||
|
||||
chop_fs() {
|
||||
sed -n '/\[fs\]/,/\[backup\]/{/\[fs\]\|\[backup\]/!p}' "$1" \
|
||||
| awk '{print length, $0}' | sort -rn | cut -d' ' -f2-
|
||||
}
|
||||
|
||||
continue_interactive() {
|
||||
printf '%s' "Do you wish to proceed?: "
|
||||
read yn
|
||||
case $yn in
|
||||
[Yy]* ) echo "Proceeding";;
|
||||
[Nn]* ) exit;;
|
||||
* ) exit;;
|
||||
esac
|
||||
}
|
||||
|
||||
remove() {
|
||||
rm -f "$@" 2> /dev/null
|
||||
while shift 2> /dev/null; do
|
||||
if [ -d "/$1" ]; then
|
||||
set +e
|
||||
rmdir "/$1" 2> /dev/null
|
||||
set -e
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
assert_deps() {
|
||||
for dep in $(grep '^deps=' "$1" | cut -d'=' -f2- | tr ':' '\n'); do
|
||||
[ -f "/usr/share/iglupkg/$dep" ] || fatal "Missing dep $dep"
|
||||
done
|
||||
}
|
||||
|
||||
CMD=$1
|
||||
PKG=$2
|
||||
|
||||
[ -z "$1" ] && usage
|
||||
|
||||
[ $(id -u) -eq 0 ] || fatal "root permissions needed"
|
||||
|
||||
if [ "$CMD" = "add" ]; then
|
||||
META_PATH=$(tar -I zstd -tf "$PKG" | grep 'usr/share/iglupkg/' | tail -n1)
|
||||
PKGNAME=$(basename "$META_PATH")
|
||||
|
||||
TMP_DIR=$(mktemp -d)
|
||||
tar -I zstd -C "$TMP_DIR" -xf "$PKG" "$META_PATH"
|
||||
assert_deps "$TMP_DIR/$META_PATH"
|
||||
|
||||
if [ -f "/$META_PATH" ]; then
|
||||
warn "package $PKGNAME already installed. upgrading ..."
|
||||
|
||||
chop_fs "$TMP_DIR/$META_PATH" > "$TMP_DIR/new"
|
||||
chop_fs "/$META_PATH" > "$TMP_DIR/old"
|
||||
|
||||
|
||||
warn "removing duplicate files ..."
|
||||
TO_REMOVE=$(diff -u "$TMP_DIR/old" "$TMP_DIR/new" | grep -v '^---' | grep -E '^\-' | cut -d'-' -f 2 | awk '{ print "/"$1 }')
|
||||
|
||||
[ -z "$TO_REMOVE" ] || warn "will remove $TO_REMOVE"
|
||||
continue_interactive
|
||||
|
||||
remove "$TO_REMOVE"
|
||||
else
|
||||
warn "installing $PKGNAME ..."
|
||||
continue_interactive
|
||||
fi
|
||||
tar -I zstd -C / -xf "$PKG"
|
||||
rm -rf "$TMP_DIR"
|
||||
elif [ "$CMD" = "del" ]; then
|
||||
META_PATH="/usr/share/iglupkg/$PKG"
|
||||
[ -f "$META_PATH" ] || fatal "package $PKG not installed"
|
||||
TO_REMOVE=$(chop_fs $META_PATH | awk '{ print "/"$1 }')
|
||||
[ -z "$TO_REMOVE" ] || warn "will remove $TO_REMOVE"
|
||||
continue_interactive
|
||||
|
||||
remove $TO_REMOVE
|
||||
else
|
||||
fatal "unknown command $CMD"
|
||||
fi
|
Loading…
Reference in a new issue