tazpkg annotate modules/mkdb @ rev 949

modules/get, modules/install: use "release checksum" too, as defined in packages.info field #9.
Checksum from packages.md5 used in verifying downloaded package file, while checksum in packages.info[$9] used in updates checking.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Jul 20 22:40:46 2017 +0300 (2017-07-20)
parents d6cbd0c5f273
children 4802158453e1
rev   line source
al@824 1 #!/bin/sh
al@824 2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
al@824 3 # mkdb - TazPkg module
al@824 4 # Make TazPkg database for folder with *.tazpkg packages
al@824 5
al@824 6
al@824 7 # Input: $1 - path to folder contains *.tazpkg packages
al@824 8 # Output files in the $1 folder:
al@824 9 # packages.info
al@824 10 # packages.equiv
al@824 11 # descriptions.txt
al@824 12 # files.list.lzma
al@824 13 # IDs
al@824 14 # Do nothing if database already exists; force rebuild it with --forced option.
al@824 15
al@824 16 # DB format:
al@824 17 # ==========
al@824 18
al@824 19 # packages.info
al@824 20 # -------------
al@824 21 # Record is line; fields are tab-separated. Fields description:
al@824 22 # 1: package name
al@824 23 # 2: version with extra-version
al@824 24 # 3: category
al@824 25 # 4: short description
al@824 26 # 5: upstream web site
al@824 27 # 6: tags (space-separated)
al@824 28 # 7: packed and unpacked sizes (space-separated) in human readable format
al@824 29 # 8: depends
al@824 30 # 9: checksum
al@824 31
al@824 32 # packages.equiv
al@824 33 # --------------
al@824 34 # This DB file used before package installation
al@824 35 # Record is line. Separator is "="
al@824 36 # Field 1 is package name to install (pkg1)
al@824 37 # Field 2 is space-separated list of items in the special format:
al@824 38 # a) pkg2:pkg3
al@824 39 # If pkg2 is installed, then install pkg3 instead of pkg1. Example:
al@824 40 # busybox=pam:busybox-pam
al@824 41 # If 'pam' is installed, then install 'busybox-pam' instead of 'busybox'
al@824 42 # b) pkg2
al@824 43 # If pkg2 already installed, then pkg1 will not be installed. Example:
al@824 44 # mysql=mariadb
al@824 45 # If 'mariadb' already installed, then 'mysql' will not be installed
al@824 46 # Complex rule example:
al@824 47 # ssh=pam:openssh-pam openssh pam:dropbear-pam dropbear
al@824 48
al@824 49 # descriptions.txt
al@824 50 # ----------------
al@824 51 # Field is line; record separator is empty line.
al@824 52 # First field is package name, rest - description itself.
al@824 53 # Empty lines in the description appended with space (" ") to avoid mess
al@824 54 # with end of record.
al@824 55
al@824 56 # files.list.lzma
al@824 57 # ---------------
al@824 58 # It is "files.list" compressed using lzma due to it's big size.
al@824 59 # Format of the files.list: record is line; field separator is ": ".
al@824 60 # First field is package name, second field is file path.
al@824 61 # There are DB records for all files installed with the package.
al@824 62
al@824 63
al@844 64 # Connect function libraries
al@824 65 . /lib/libtaz.sh
al@824 66
al@844 67 # Get TazPkg working environment
al@844 68 . @@MODULES@@/getenv
al@824 69
al@844 70
al@824 71
al@824 72
al@824 73 # Exit if input folder not specified
al@824 74 [ -z "$1" ] && die 'Input folder not specified'
al@824 75
al@824 76 # Exit if input folder not exists
al@844 77 folder=$(realpath "$root$1") || exit 1
al@824 78
al@824 79 # Exit if folder is not writable
al@824 80 [ ! -w "$folder" ] && die 'You are not allowed to write to the folder "%s"' "$folder"
al@824 81
al@824 82 # Exit if input folder does not contain packages
al@824 83 [ -z "$(find "$folder" -maxdepth 1 -name '*.tazpkg')" ] && \
al@824 84 die 'Folder "%s" does not contain packages' "$folder"
al@824 85
al@824 86
al@824 87 # DB file names
al@824 88 DBi="$folder/packages.info"
al@824 89 DBe="$folder/packages.equiv"
al@824 90 DBd="$folder/descriptions.txt"
al@824 91 DBf="$folder/files.list"
al@824 92
al@824 93 # Pre-remove DB if --forced and DB exists
al@824 94 if [ -n "$forced" ]; then
al@824 95 [ -e "$DBi" ] && rm "$DBi"
al@824 96 [ -e "$DBe" ] && rm "$DBe"
al@824 97 [ -e "$DBd" ] && rm "$DBd"
al@824 98 [ -e "$DBf.lzma" ] && rm "$DBf.lzma"
al@824 99 fi
al@824 100
al@824 101 if [ -s "$DBi" ]; then
al@824 102 _ 'Packages DB already exists.' >&2
al@824 103 exit 1
al@824 104 fi
al@824 105
al@824 106 # Random temporary folder
al@824 107 tempd="$(mktemp -d)"
al@824 108
al@824 109 # Make temporary list of packages checksum (usually md5sum)
al@824 110 _n 'Calculate %s...' "$CHECKSUM"
al@824 111 cd "$folder"; $CHECKSUM *.tazpkg > "$tempd/$SUM"
al@824 112 status
al@824 113
al@824 114 cd "$tempd"
al@824 115
al@824 116 # Loop for every package
al@824 117 while read pkgsum pkgfile; do
al@824 118 # Current processed package
al@824 119 echo -n "$pkgfile"
al@824 120
al@824 121 # Extract receipt from package
al@824 122 cpio -F "$folder/$pkgfile" -i receipt >/dev/null 2>&1
al@824 123
al@824 124 # Unset variables that may absent in the receipt
al@824 125 unset EXTRAVERSION TAGS DEPENDS PROVIDE
al@824 126 # Get values
al@824 127 . receipt; rm receipt
al@824 128
al@824 129
al@824 130 # Make packages.info
al@824 131 echo -en "$PACKAGE\t$VERSION$EXTRAVERSION\t$CATEGORY\t" >> "$DBi"
al@824 132 echo -en "$SHORT_DESC\t$WEB_SITE\t$TAGS\t" >> "$DBi"
al@824 133 echo -en "$PACKED_SIZE $UNPACKED_SIZE\t" | sed 's|\.0||g' >> "$DBi"
al@824 134 echo -n $DEPENDS$'\t' >> "$DBi"
al@824 135 echo $pkgsum >> "$DBi"
al@824 136
al@824 137
al@824 138 # Make packages.equiv
al@824 139 for i in $PROVIDE; do
al@824 140 # Example from busybox-pam package:
al@824 141 # PACKAGE="busybox-pam", PROVIDE="busybox:pam"
al@824 142 case $i in
al@824 143 # DEST="pam:"
al@824 144 *:*) DEST="${i#*:}:";;
al@824 145 *) DEST='';;
al@824 146 esac
al@824 147 # PKG="busybox"
al@824 148 PKG="${i%:*}"
al@824 149 if grep -qs ^$PKG= "$DBe"; then
al@824 150 # Append existing record
al@824 151 sed -i "s|^$PKG=|\0 $DEST$PACKAGE|" "$DBe"
al@824 152 else
al@824 153 # Add new record
al@824 154 echo "$PKG=$DEST$PACKAGE" >> "$DBe"
al@824 155 fi
al@824 156 done
al@824 157
al@824 158
al@824 159 # Make descriptions.txt
al@824 160 if cpio -F "$folder/$pkgfile" -t 2>/dev/null | fgrep -q 'description.txt'; then
al@824 161 # Extract description.txt from package
al@824 162 cpio -F "$folder/$pkgfile" -i description.txt >/dev/null 2>&1
al@824 163 # Append descriptions DB
al@824 164 echo "$PACKAGE" >> "$DBd"
al@824 165 cat description.txt | sed 's|^$| |' >> "$DBd"
al@824 166 echo >> "$DBd"
al@824 167 rm description.txt
al@824 168 fi
al@824 169
al@824 170
al@824 171 # Make files.list
al@824 172 if cpio -F "$folder/$pkgfile" -t 2>/dev/null | fgrep -q 'files.list'; then
al@824 173 # Extract files.list from package
al@824 174 cpio -F "$folder/$pkgfile" -i files.list >/dev/null 2>&1
al@824 175 # Append files list DB
al@824 176 sed "s|.*|$PACKAGE: \0|" files.list >> "$DBf"
al@824 177 rm files.list
al@824 178 fi
al@824 179
al@824 180 # End line with the status
al@824 181 status
al@824 182 done < "$tempd/$SUM"
al@824 183
al@824 184
al@824 185 # Sort DB alphabetically
al@824 186 sort -o "$tempd/pi" "$DBi"; mv -f "$tempd/pi" "$DBi"
al@824 187
al@824 188 # Create empty files if they not exists
al@824 189 touch "$DBi" "$DBe" "$DBd" "$DBf"
al@824 190
al@824 191 # Compress files.list using lzma
al@824 192 sort -k2 -o "$DBf.sorted" "$DBf"
al@824 193 lzma e "$DBf.sorted" "$DBf.lzma"
al@824 194 rm "$DBf" "$DBf.sorted"
al@824 195
al@824 196 # Make DB readable for all
al@824 197 chmod a+r "$DBi" "$DBe" "$DBd" "$DBf.lzma"
al@824 198
al@824 199
al@824 200 # Make files for DB recharge
al@824 201 # --------------------------
al@824 202
al@824 203 cd "$folder"
al@824 204
al@824 205 # Make IDs: md5 and timestamp
al@824 206 ( md5sum "$tempd/$SUM" | cut -d' ' -f1 | tr '\n' ' '; date -ur "$DBi" +%s ) > IDs
al@824 207
al@824 208
al@824 209 # Make files-list.md5: decide whether to download files.list.lzma or not
al@824 210 md5sum "$DBf.lzma" | cut -d' ' -f1 | tr -d $'\n' > files-list.md5
al@824 211
al@824 212 # Make bundle to fast recharge
al@824 213 [ -f 'bundle.tar.lzma' ] && rm 'bundle.tar.lzma'
al@846 214 tar -chaf bundle.tar.lzma \
al@824 215 files-list.md5 packages.info descriptions.txt packages.equiv
al@824 216
al@824 217 # Clean up
al@824 218 rm files-list.md5
al@824 219 rm -r "$tempd"
al@824 220