tazpkg diff modules/mkdb @ rev 824

Add module "mkdb"; pkgs.cgi: fix AJAX loader display
author Aleksej Bobylev <al.bobylev@gmail.com>
date Tue Aug 04 02:29:51 2015 +0300 (2015-08-04)
parents
children a02e36d44d06
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/modules/mkdb	Tue Aug 04 02:29:51 2015 +0300
     1.3 @@ -0,0 +1,222 @@
     1.4 +#!/bin/sh
     1.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
     1.6 +# mkdb - TazPkg module
     1.7 +# Make TazPkg database for folder with *.tazpkg packages
     1.8 +
     1.9 +
    1.10 +# Input:  $1 - path to folder contains *.tazpkg packages
    1.11 +# Output files in the $1 folder:
    1.12 +#    packages.info
    1.13 +#    packages.equiv
    1.14 +#    descriptions.txt
    1.15 +#    files.list.lzma
    1.16 +#    IDs
    1.17 +# Do nothing if database already exists; force rebuild it with --forced option.
    1.18 +
    1.19 +# DB format:
    1.20 +# ==========
    1.21 +
    1.22 +# packages.info
    1.23 +# -------------
    1.24 +# Record is line; fields are tab-separated. Fields description:
    1.25 +# 1: package name
    1.26 +# 2: version with extra-version
    1.27 +# 3: category
    1.28 +# 4: short description
    1.29 +# 5: upstream web site
    1.30 +# 6: tags (space-separated)
    1.31 +# 7: packed and unpacked sizes (space-separated) in human readable format
    1.32 +# 8: depends
    1.33 +# 9: checksum
    1.34 +
    1.35 +# packages.equiv
    1.36 +# --------------
    1.37 +# This DB file used before package installation
    1.38 +# Record is line. Separator is "="
    1.39 +# Field 1 is package name to install (pkg1)
    1.40 +# Field 2 is space-separated list of items in the special format:
    1.41 +#    a) pkg2:pkg3
    1.42 +#       If pkg2 is installed, then install pkg3 instead of pkg1. Example:
    1.43 +#       busybox=pam:busybox-pam
    1.44 +#       If 'pam' is installed, then install 'busybox-pam' instead of 'busybox'
    1.45 +#    b) pkg2
    1.46 +#       If pkg2 already installed, then pkg1 will not be installed. Example:
    1.47 +#       mysql=mariadb
    1.48 +#       If 'mariadb' already installed, then 'mysql' will not be installed
    1.49 +# Complex rule example:
    1.50 +#    ssh=pam:openssh-pam openssh pam:dropbear-pam dropbear
    1.51 +
    1.52 +# descriptions.txt
    1.53 +# ----------------
    1.54 +# Field is line; record separator is empty line.
    1.55 +# First field is package name, rest - description itself.
    1.56 +# Empty lines in the description appended with space (" ") to avoid mess
    1.57 +# with end of record.
    1.58 +
    1.59 +# files.list.lzma
    1.60 +# ---------------
    1.61 +# It is "files.list" compressed using lzma due to it's big size.
    1.62 +# Format of the files.list: record is line; field separator is ": ".
    1.63 +# First field is package name, second field is file path.
    1.64 +# There are DB records for all files installed with the package.
    1.65 +
    1.66 +
    1.67 +# Preparations
    1.68 +# Get config values (CHECKSUM)
    1.69 +. /etc/slitaz/slitaz.conf
    1.70 +# Connect functions library
    1.71 +. /lib/libtaz.sh
    1.72 +
    1.73 +
    1.74 +# Report error and finish work
    1.75 +die() { longline "$(_ "$@")" >&2; exit 1; }
    1.76 +
    1.77 +
    1.78 +# Exit if input folder not specified
    1.79 +[ -z "$1" ] && die 'Input folder not specified'
    1.80 +
    1.81 +# Exit if input folder not exists
    1.82 +folder="$(realpath "$1")" || exit 1
    1.83 +
    1.84 +# Exit if folder is not writable
    1.85 +[ ! -w "$folder" ] && die 'You are not allowed to write to the folder "%s"' "$folder"
    1.86 +
    1.87 +# Exit if input folder does not contain packages
    1.88 +[ -z "$(find "$folder" -maxdepth 1 -name '*.tazpkg')" ] && \
    1.89 +	die 'Folder "%s" does not contain packages' "$folder"
    1.90 +
    1.91 +
    1.92 +# DB file names
    1.93 +DBi="$folder/packages.info"
    1.94 +DBe="$folder/packages.equiv"
    1.95 +DBd="$folder/descriptions.txt"
    1.96 +DBf="$folder/files.list"
    1.97 +
    1.98 +# Pre-remove DB if --forced and DB exists
    1.99 +if [ -n "$forced" ]; then
   1.100 +	[ -e "$DBi" ] && rm "$DBi"
   1.101 +	[ -e "$DBe" ] && rm "$DBe"
   1.102 +	[ -e "$DBd" ] && rm "$DBd"
   1.103 +	[ -e "$DBf.lzma" ] && rm "$DBf.lzma"
   1.104 +fi
   1.105 +
   1.106 +if [ -s "$DBi" ]; then
   1.107 +	_ 'Packages DB already exists.' >&2
   1.108 +	exit 1
   1.109 +fi
   1.110 +
   1.111 +# Random temporary folder
   1.112 +tempd="$(mktemp -d)"
   1.113 +
   1.114 +# Make temporary list of packages checksum (usually md5sum)
   1.115 +_n 'Calculate %s...' "$CHECKSUM"
   1.116 +cd "$folder"; $CHECKSUM *.tazpkg > "$tempd/$SUM"
   1.117 +status
   1.118 +
   1.119 +cd "$tempd"
   1.120 +
   1.121 +# Loop for every package
   1.122 +while read pkgsum pkgfile; do
   1.123 +	# Current processed package
   1.124 +	echo -n "$pkgfile"
   1.125 +
   1.126 +	# Extract receipt from package
   1.127 +	cpio -F "$folder/$pkgfile" -i receipt >/dev/null 2>&1
   1.128 +
   1.129 +	# Unset variables that may absent in the receipt
   1.130 +	unset EXTRAVERSION TAGS DEPENDS PROVIDE
   1.131 +	# Get values
   1.132 +	. receipt; rm receipt
   1.133 +
   1.134 +
   1.135 +	# Make packages.info
   1.136 +	echo -en "$PACKAGE\t$VERSION$EXTRAVERSION\t$CATEGORY\t" >> "$DBi"
   1.137 +	echo -en "$SHORT_DESC\t$WEB_SITE\t$TAGS\t" >> "$DBi"
   1.138 +	echo -en "$PACKED_SIZE $UNPACKED_SIZE\t" | sed 's|\.0||g' >> "$DBi"
   1.139 +	echo -n $DEPENDS$'\t' >> "$DBi"
   1.140 +	echo $pkgsum >> "$DBi"
   1.141 +
   1.142 +
   1.143 +	# Make packages.equiv
   1.144 +	for i in $PROVIDE; do
   1.145 +		# Example from busybox-pam package:
   1.146 +		# PACKAGE="busybox-pam", PROVIDE="busybox:pam"
   1.147 +		case $i in
   1.148 +			# DEST="pam:"
   1.149 +			*:*) DEST="${i#*:}:";;
   1.150 +			*)   DEST='';;
   1.151 +		esac
   1.152 +		# PKG="busybox"
   1.153 +		PKG="${i%:*}"
   1.154 +		if grep -qs ^$PKG= "$DBe"; then
   1.155 +			# Append existing record
   1.156 +			sed -i "s|^$PKG=|\0 $DEST$PACKAGE|" "$DBe"
   1.157 +		else
   1.158 +			# Add new record
   1.159 +			echo "$PKG=$DEST$PACKAGE" >> "$DBe"
   1.160 +		fi
   1.161 +	done
   1.162 +
   1.163 +
   1.164 +	# Make descriptions.txt
   1.165 +	if cpio -F "$folder/$pkgfile" -t 2>/dev/null | fgrep -q 'description.txt'; then
   1.166 +		# Extract description.txt from package
   1.167 +		cpio -F "$folder/$pkgfile" -i description.txt >/dev/null 2>&1
   1.168 +		# Append descriptions DB
   1.169 +		echo "$PACKAGE" >> "$DBd"
   1.170 +		cat description.txt | sed 's|^$| |' >> "$DBd"
   1.171 +		echo >> "$DBd"
   1.172 +		rm description.txt
   1.173 +	fi
   1.174 +
   1.175 +
   1.176 +	# Make files.list
   1.177 +	if cpio -F "$folder/$pkgfile" -t 2>/dev/null | fgrep -q 'files.list'; then
   1.178 +		# Extract files.list from package
   1.179 +		cpio -F "$folder/$pkgfile" -i files.list >/dev/null 2>&1
   1.180 +		# Append files list DB
   1.181 +		sed "s|.*|$PACKAGE: \0|" files.list >> "$DBf"
   1.182 +		rm files.list
   1.183 +	fi
   1.184 +
   1.185 +	# End line with the status
   1.186 +	status
   1.187 +done < "$tempd/$SUM"
   1.188 +
   1.189 +
   1.190 +# Sort DB alphabetically
   1.191 +sort -o "$tempd/pi" "$DBi"; mv -f "$tempd/pi" "$DBi"
   1.192 +
   1.193 +# Create empty files if they not exists
   1.194 +touch "$DBi" "$DBe" "$DBd" "$DBf"
   1.195 +
   1.196 +# Compress files.list using lzma
   1.197 +sort -k2 -o "$DBf.sorted" "$DBf"
   1.198 +lzma e "$DBf.sorted" "$DBf.lzma"
   1.199 +rm "$DBf" "$DBf.sorted"
   1.200 +
   1.201 +# Make DB readable for all
   1.202 +chmod a+r "$DBi" "$DBe" "$DBd" "$DBf.lzma"
   1.203 +
   1.204 +
   1.205 +# Make files for DB recharge
   1.206 +# --------------------------
   1.207 +
   1.208 +cd "$folder"
   1.209 +
   1.210 +# Make IDs: md5 and timestamp
   1.211 +( md5sum "$tempd/$SUM" | cut -d' ' -f1 | tr '\n' ' '; date -ur "$DBi" +%s ) > IDs
   1.212 +
   1.213 +
   1.214 +# Make files-list.md5: decide whether to download files.list.lzma or not
   1.215 +md5sum "$DBf.lzma" | cut -d' ' -f1 | tr -d $'\n' > files-list.md5
   1.216 +
   1.217 +# Make bundle to fast recharge
   1.218 +[ -f 'bundle.tar.lzma' ] && rm 'bundle.tar.lzma'
   1.219 +busybox tar -chaf bundle.tar.lzma \
   1.220 +	files-list.md5 packages.info descriptions.txt packages.equiv
   1.221 +
   1.222 +# Clean up
   1.223 +rm files-list.md5
   1.224 +rm -r "$tempd"
   1.225 +