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 +