From 8f1f7dabfd08c8878fde40110d549fb661413952 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sun, 15 Jan 2017 17:22:23 +0100 Subject: [PATCH] Allow usage of packages instead of installed info in /var/log for convert32pkg.sh --- convert32pkg.sh | 95 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 31 deletions(-) diff --git a/convert32pkg.sh b/convert32pkg.sh index db9fa67..622f909 100755 --- a/convert32pkg.sh +++ b/convert32pkg.sh @@ -4,21 +4,18 @@ pkginfodir='/var/log/packages/' pkgscriptdir='/var/log/scripts/' if [ "$#" -lt 1 ]; then - echo "Usage: $0 " 1>&2 + echo "Usage: $0 [package64]" 1>&2 exit 1 fi -pkg="$1" - -temp="$(mktemp -d)" -trap "rm -rf '$temp'" EXIT - -tar xf "$pkg" -C "$temp" +pkg32="$(realpath "$1")" +unset pkg64 +[ "$2" ] && pkg64="$(realpath "$2")" # Extract all package info # See /sbin/installpkg -pkgbase="$(echo "$pkg" | sed -e 's?.*/??;s/\.t[bglx]z$//')" -pkgext="$(echo "$pkg" | sed -e 's?.*/??;s/.*\.\(t[bglx]z\)$/\1/')" +pkgbase="$(echo "$pkg32" | sed -e 's?.*/??;s/\.t[bglx]z$//')" +pkgext="$(echo "$pkg32" | sed -e 's?.*/??;s/.*\.\(t[bglx]z\)$/\1/')" pkgname="$(echo "$pkgbase" | sed -e 's?-[^-]*-[^-]*-[^-]*$??')" pkgver="$(echo "$pkgbase" | sed -e 's?.*-\([^-]*\)-[^-]*-[^-]*$?\1?')" pkgarch="$(echo "$pkgbase" | sed -e 's?.*-[^-]*-\([^-]*\)-[^-]*$?\1?')" @@ -26,31 +23,67 @@ pkgbuild="$(echo "$pkgbase" | sed -e 's?.*-[^-]*-[^-]*-\([^-]*\)$?\1?')" pkginfo="$pkginfodir/$pkgname-$pkgver-x86_64-$pkgbuild" pkgscript="$pkgscriptdir/$pkgname-$pkgver-x86_64-$pkgbuild" -if [ ! -f "$pkginfo" ]; then - echo "Package $pkgname-$pkgver-x86_64-$pkgbuild is not installed. Can't proceed." 1>&2 - exit 1 -fi -# See /sbin/removepkg -if fgrep "./" "$pkginfo" 1> /dev/null 2>&1; then - TRIGGER="^\.\/" +case "$pkgext" in + tgz) tool=gzip ;; + tbz) tool=bzip2 ;; + tlz) tool=lzma ;; + txz) tool=xz ;; +esac + +temp="$(mktemp -d)" +trap "rm -rf '$temp'" EXIT + +cd "$temp" +explodepkg "$pkg32" + +# Remove all files present in the x86_64 package +if [ "$pkg64" ]; then + $tool -cd "$pkg64" | tar-1.13 t | grep -v "^install/" | while read -r file; do + rm -vf "./$file" 2> /dev/null || true + done else - TRIGGER="FILE LIST:" + if [ ! -f "$pkginfo" ]; then + echo "Package '$pkgname-$pkgver-x86_64-$pkgbuild' is not installed. Can't proceed." 1>&2 + exit 1 + fi + + # See /sbin/removepkg + if fgrep "./" "$pkginfo" 1> /dev/null 2>&1; then + TRIGGER="^\.\/" + else + TRIGGER="FILE LIST:" + fi + sed -n "/$TRIGGER/,/^$/p" "$pkginfo" | fgrep -v "FILE LIST:" | grep -v "^install/" | while read -r file; do + rm -vf "./$file" 2> /dev/null || true + done fi -# Remove all files present in the x86_64 package -sed -n "/$TRIGGER/,/^$/p" "$pkginfo" | fgrep -v "FILE LIST:" | grep -v "^install/" | sort -u | while read -r file; do - rm -vf "$temp/$file" 2> /dev/null || true -done -find "$temp" -mindepth 1 -type d -empty -delete +# Clean empty directories +find . -mindepth 1 -type d -empty -delete # Remove all symlinks present in the x86_64 package -# See /sbin/removepkg -sed -n -e 's,^[ ]*( [ ]*cd[ ]* .* [ ]*; [ ]*\(rm\|ln\) [ ]*-\(rf\|sf\)[ ]* .* [ ]*)[ ]*$,&,p' -e 's,^[ ]*config .*[ ]*,&,p' "$pkgscript" > "$temp/install/doinst" -fgrep -vxf "$temp/install/doinst" "$temp/install/doinst.sh" > "$temp/install/doinst.sh.new" -mv "$temp/install/doinst.sh.new" "$temp/install/doinst.sh" -rm -f "$temp/install/doinst" - -( cd "$temp" - makepkg -l y -c n "$OLDPWD/$pkgname-compat32-$pkgver-x86_64-$pkgbuild.$pkgext" -) +if [ -f install/doinst.sh ]; then + if [ "$pkg64" ]; then + if ! $tool -cd "$pkg64" | tar-1.13 xO install/doinst.sh > install/doinst.64; then + echo "Failed to extract install/doinst.sh from '$pkg64'. Aborting." 1>&2 + exit 1 + fi + else + if [ ! -f "$pkgscript" ]; then + echo "Package '$pkgname-$pkgver-x86_64-$pkgbuild' is installed but has no installation script. Can't proceed." 1>&2 + exit 1 + fi + cp "$pkgscript" install/doinst.64 + fi + + # Extract all lines treating with symlinks. See /sbin/removepkg + sed -n -e 's,^[ ]*( [ ]*cd[ ]* .* [ ]*; [ ]*\(rm\|ln\) [ ]*-\(rf\|sf\)[ ]* .* [ ]*)[ ]*$,&,p' -e 's,^[ ]*config .*[ ]*,&,p' install/doinst.64 > install/doinst + + # Remove all symlinks present in the x86_64 package + fgrep -vxf install/doinst install/doinst.sh > install/doinst.sh.new + mv install/doinst.sh.new install/doinst.sh + rm -f install/doinst install/doinst.64 +fi + +makepkg -l y -c n "$OLDPWD/convert32-$pkgname-$pkgver-x86_64-$pkgbuild.$pkgext"