s243a

sync_dpkg_fm_builtin.sh (Draft #1)

Feb 16th, 2021 (edited)
470
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.17 KB | None | 0 0
  1. #!/bin/bash
  2. ADMIN_DIR=/var/lib/dpkg
  3. APT_SOURCES_DIR=/etc/apt/sources.list.d
  4. APT_PKGDB_DIR=/var/lib/apt/lists
  5. CHROOT_DIR="${CHROOT_DIR:-/mnt/+aufs+devsave+test_save+ext2/Kali/kalipup_CLI.tar.gz.extracted/kalipup/puppy_upupgg+d_20.10.sfs.extracted/kali}"
  6.  
  7. #based on https://github.com/s243a/woof-next/blob/e6590c1044adc0a182a9b299129ed707b7bd95d2/builders/deb-build.sh#L80
  8. prepare_dirs() {
  9.   for aDir in "$CHROOT_DIR" "$CHROOT_DIR$APT_SOURCES_DIR" "$CHROOT_DIR$APT_PKGDB_DIR"; do
  10.     [ ! -z "`which realpath`" ] && aDir=$(realpath -m "$aDir")
  11.     mkdir -p "$aDir"
  12.   done
  13.   ! [ -e $CHROOT_DIR$ADMIN_DIR/status ]    && echo > $CHROOT_DIR$ADMIN_DIR/status
  14.   ! [ -e $CHROOT_DIR$ADMIN_DIR/available ] && echo > $CHROOT_DIR$ADMIN_DIR/available
  15. }
  16.  
  17. #based on https://github.com/s243a/woof-next/blob/e6590c1044adc0a182a9b299129ed707b7bd95d2/builders/deb-build.sh#L457
  18. function update_pkg_status(){
  19. #Probably better just to call remove_pkg_status instead of processing args.
  20. #while [ ! -z $1 ];
  21. #  case $1 in
  22. #    --status=*)
  23. #    shift
  24. #    ;;
  25. #  *)
  26. #    break
  27. #    ;;
  28. #  esac
  29. #TODO: add escaping for first pattern bellow.
  30. if [ -z "$(grep "^Package: $1"'[:space:]*$')" ] && [ -z "$(grep -F "Package: $1")" ]; then
  31.     {
  32. echo \
  33. "Package: $1
  34. Status: install ok installed
  35. Priority: $2
  36. Section:  $3
  37. Maintainer: unspecified
  38. Architecture: $ARCH
  39. Version: $4"
  40. [ "${5%,}" ] && echo "Depends: ${5%,}"
  41. echo "Description: $1 installed by deb-build.sh
  42. "
  43.     } >> "$CHROOT_DIR$ADMIN_DIR/status"
  44.  
  45. fi
  46. }
  47. #based on https://pastebin.com/cRcR6yE2
  48.   AWK_PRG=$(cat <<EOF
  49.   function dep_fix(str,     a,k1,p1,p2,out,seps){
  50.       split(str,a,",")
  51.       out = ""
  52.       #print "str=" str
  53.       for (k1 in a){
  54.           p1=a[k1]
  55.           #print "a[ " k1 "]=" a[k1]
  56.           gsub(/^+/,"",p1)
  57.           split(p1,p2,/\&../,seps) # +libqpdf21&gt8.4 > p2[1]="+libqpdf21" seps[1]="&gt" p2[2]="8.4",
  58.           #print "p2[0]=" p2[0]
  59.           #print "p2[1]=" p2[1]
  60.           #print "p2[2]=" p2[2]
  61.           #print "seps[1]=" seps[1]
  62.           switch (seps[1]) {  
  63.           case "&gt":
  64.             out = out ", " p2[1] " (>" p2[2] ")"
  65.             break
  66.           case "&ge":
  67.             out = out ", " p2[1] " (>=" p2[2] ")"
  68.             break
  69.           case "&lt":
  70.             out = out ", " p2[1] " (<" p2[2] ")"
  71.             break
  72.           case "&le":
  73.             out = out "," p2[1] " (<=" p2[2] ")"
  74.             break
  75.           case "&eq":
  76.             out = out ", " p2[1] " (=" p2[2] ")"
  77.             break
  78.           default:
  79.             out = out ", " p2[1]
  80.             break
  81.          }
  82.          gsub(/^, /,"",out)
  83.          
  84.      }
  85.      return out
  86.   }
  87.   BEGIN{FS="|"}
  88.   {
  89.      PACKAGE=\$2
  90.      print "Package: " PACKAGE
  91.      VERSION = \$3
  92.      #TODO make PACKAGE regular expression safe
  93.      gsub(/[+]/,"\\\\+",PACKAGE)
  94.      gsub(PACKAGE,"",VERSION)
  95.      gsub(/^_/,"",VERSION)
  96.      gsub(/_[^_]*$/,"",VERSION)
  97.      print "Version: " VERSION
  98.      ARCH = \$1
  99.      gsub(/.*_/,"",ARCH)
  100.      if ( ARCH == "i386" ){
  101.        print "Architecture: " ARCH
  102.      } else if (  ARCH = noarch ){
  103.        print "Architecture: noarch"
  104.      }
  105.      #TODO Architecture: \$1 but trimmed after last _ check that it is like i386
  106.      print "Maintainer: unspecified"
  107.      DEPS = \$9
  108.      DEPS = dep_fix(DEPS)
  109.      if (length(DEPS)>0){
  110.        print "Depends: " DEPS
  111.      }
  112.      print "Priority: " PRIORITY
  113.      print "Section: " \$5
  114.      print ""
  115.     }
  116. EOF
  117. )
  118. #echo "$AWK_PRG"
  119. function append_statuses(){
  120.   for aFile in "$@"; do
  121.     aFile=$(realpath -m "$CHROOT_DIR$aFile")
  122.     [ ! -e "$aFile" ] && continue
  123.     if [[ aFile = */woof-installed-packages ]]; then
  124.       PRIORITY=required
  125.       ESSENTIAL=yes
  126.     else
  127.       PRIORITY=optional
  128.       ESSENTIAL=no    
  129.     fi
  130.     #cat "$aFile" | awk --assign PRIORITY="$PRIORITY" "$AWK_PRG"  >> "$CHROOT_DIR$ADMIN_DIR/status"
  131.     while read line; do
  132.       pkg="$(echo "$line" | cut -f2 -d'|')"
  133.       if [ -z "$(grep "^Package: $pkg"'[:space:]*$')" ] && [ -z "$(grep -F "Package: $pkg")" ]; then
  134.         echo "$line" | awk --assign PRIORITY="$PRIORITY" "$AWK_PRG"  >> "$CHROOT_DIR$ADMIN_DIR/status"
  135.       fi
  136.     done < <(cat "$aFile")
  137.   done
  138.    
  139. }
  140. mv $CHROOT_DIR$ADMIN_DIR/status $CHROOT_DIR$ADMIN_DIR/status_back$$
  141. prepare_dirs
  142. append_statuses /var/packages/woof-installed-packages /var/packages/user-installed-packages
  143. #TODO symlink file lists
  144.  
Add Comment
Please, Sign In to add comment