tazpkg annotate modules/install @ 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.
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 | dbf40347342a |
children | 4802158453e1 |
rev | line source |
---|---|
al@844 | 1 #!/bin/sh |
al@844 | 2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg |
al@844 | 3 # install - TazPkg module |
al@844 | 4 # Install packages |
al@844 | 5 |
al@844 | 6 |
al@844 | 7 # Connect function libraries |
paul@936 | 8 . /lib/libtaz.sh |
al@844 | 9 . /usr/lib/slitaz/libpkg.sh |
al@844 | 10 |
al@844 | 11 |
al@844 | 12 # Get TazPkg working environment |
al@844 | 13 . @@MODULES@@/getenv |
al@844 | 14 # $CACHE_DIR will change, it based on unchanged value of $SAVE_CACHE_DIR |
al@844 | 15 SAVE_CACHE_DIR="$CACHE_DIR" |
al@844 | 16 |
al@844 | 17 |
al@844 | 18 . @@MODULES@@/find-depends |
al@844 | 19 |
al@844 | 20 |
al@844 | 21 |
al@844 | 22 |
al@844 | 23 # Log TazPkg activity |
al@844 | 24 |
al@844 | 25 log_pkg() { |
al@844 | 26 debug "\nlog_pkg('$1')\n PACKAGE='$PACKAGE'\n VERSION='$VERSION'\n EXTRAVERSION='$EXTRAVERSION'" |
al@844 | 27 |
al@844 | 28 local extra |
al@844 | 29 |
al@844 | 30 [ "$1" == 'Installed' ] && \ |
al@844 | 31 extra=" - $(fgrep " $PACKAGE-$VERSION" "$PKGS_DB/installed.$SUM" | awk '{print $1}')" |
al@844 | 32 debug " extra='$extra'" |
al@844 | 33 |
al@844 | 34 [ -w "$LOG" ] && |
al@844 | 35 echo "$(date +'%F %T') - $1 - $PACKAGE ($VERSION$EXTRAVERSION)$extra" >> $LOG |
al@844 | 36 } |
al@844 | 37 |
al@844 | 38 |
al@844 | 39 # get an already installed package from packages.equiv |
al@844 | 40 |
al@844 | 41 equivalent_pkg() { |
al@945 | 42 # input: $1 = dependency package name (like "nano"); |
al@945 | 43 # $2 = package path/name for which dependency tested |
al@844 | 44 local i rep rules rule out |
al@844 | 45 |
al@945 | 46 if [ -n "$local" ]; then |
al@945 | 47 # Search for virtual packages |
al@945 | 48 if [ -n "$cookmode" ]; then |
al@945 | 49 pi='/home/slitaz/packages/packages.info' |
al@945 | 50 else |
al@945 | 51 pi="$(dirname "$2")/packages.info" |
al@945 | 52 fi |
al@945 | 53 [ -f "$pi" ] && |
al@945 | 54 out=$(awk -F$'\t' -vpkg="$1" '{ |
al@945 | 55 # if package name or provided package name matched |
al@945 | 56 if ($1 == pkg || index(" " $10 " ", " " pkg " ")) { print $1 } |
al@945 | 57 }' "$pi") |
al@945 | 58 for i in $out; do |
al@945 | 59 # If package installed |
al@945 | 60 [ -f "$PKGS_DB/installed/$i/receipt" ] && out="$i" && break |
al@945 | 61 unset out |
al@945 | 62 done |
al@945 | 63 else |
al@945 | 64 rules=$(for rep in $PRIORITY; do |
al@945 | 65 grep -hs "^$1=" "$rep/packages.equiv" |
al@945 | 66 done | sed "s|^$1=||") |
al@945 | 67 debug " >rules='$rules'" |
al@844 | 68 |
al@945 | 69 for rule in $rules; do |
al@945 | 70 debug " >rule='$rule'" |
al@945 | 71 case $rule in |
al@945 | 72 *:*) |
al@945 | 73 debug '-- x:x' |
al@945 | 74 # format 'alternative:newname' |
al@945 | 75 # if alternative is installed then substitute newname |
al@945 | 76 out="${rule#*:}" |
al@945 | 77 awk -F$'\t' -vp="${rule%:*}" '$1==p{exit 1}' "$PKGS_DB/installed.info" || break |
al@945 | 78 debug '-- x:x /' |
al@945 | 79 ;; |
al@945 | 80 *) |
al@945 | 81 debug '-- x' |
al@945 | 82 # unconditional substitution |
al@945 | 83 out="$rule" |
al@945 | 84 awk -F$'\t' -vp="$rule" '$1==p{exit 1}' "$PKGS_DB/installed.info" || break |
al@945 | 85 debug '-- x /' |
al@945 | 86 ;; |
al@945 | 87 esac |
al@945 | 88 unset out |
al@945 | 89 done |
al@945 | 90 fi |
al@844 | 91 debug '--' |
al@844 | 92 # if not found in packages.equiv then no substitution |
al@844 | 93 echo "${out:-$1}" |
al@844 | 94 } |
al@844 | 95 |
al@844 | 96 |
al@844 | 97 # Check and install all missing deps. |
al@844 | 98 # Auto install or ask user then install all missing deps from local dir, CD-ROM, |
al@844 | 99 # media or from the mirror. |
al@844 | 100 |
al@846 | 101 install_all_deps() { |
al@844 | 102 # input: $1 = package file to check/install missing dependencies |
al@844 | 103 # ROOT READY |
al@844 | 104 # dep: equivalent_pkg. |
al@844 | 105 |
al@844 | 106 debug "\ninstall_all_deps('$1')" |
al@844 | 107 |
al@844 | 108 local TMP_DIR DEPENDS num missing_packages equiv pkg answer dir found pkgfile |
al@844 | 109 |
al@844 | 110 # Check for missing deps listed in a receipt packages. |
al@844 | 111 |
al@844 | 112 # Get the receipt's variable DEPENDS |
al@844 | 113 DEPENDS=$( |
al@844 | 114 TMP_DIR=$(mktemp -d); cd "$TMP_DIR" |
al@844 | 115 cpio --quiet -i receipt >/dev/null 2>&1 |
al@844 | 116 . receipt; echo $DEPENDS |
al@844 | 117 rm -rf "$TMP_DIR" |
al@844 | 118 ) < "$1" |
al@844 | 119 |
al@844 | 120 unset num missing_packages |
al@844 | 121 for depend in $DEPENDS; do |
al@844 | 122 debug " depend='$depend'" |
al@945 | 123 equiv=$(equivalent_pkg $depend "$1") |
al@844 | 124 debug " equiv='$equiv'\n" |
al@844 | 125 if [ ! -d "$INSTALLED/$equiv" ]; then |
al@844 | 126 missing_packages="$missing_packages $equiv" |
al@844 | 127 num=$((num+1)) |
al@844 | 128 elif [ ! -f "$INSTALLED/$equiv/receipt" ]; then |
al@880 | 129 [ -z "$quiet" ] && _ 'WARNING! Dependency loop between "%s" and "%s".' "$PACKAGE" "$equiv" |
al@844 | 130 fi |
al@844 | 131 done |
al@844 | 132 |
al@844 | 133 # Nothing to install, exit function |
al@844 | 134 [ -z "$num" ] && return |
al@844 | 135 |
al@844 | 136 |
al@880 | 137 title "$(_ 'Tracking dependencies for package "%s"' "$PACKAGE")" |
al@844 | 138 |
al@844 | 139 # Individual messages for each missing package |
al@878 | 140 [ -z "$quiet" ] && \ |
al@844 | 141 for pkg in $missing_packages; do |
al@844 | 142 _ 'Missing package "%s"' "$pkg" |
al@844 | 143 done |
al@844 | 144 |
al@880 | 145 footer "$(_p \ |
al@844 | 146 '%s missing package to install.' \ |
al@844 | 147 '%s missing packages to install.' "$num" \ |
al@844 | 148 "$num")" |
al@844 | 149 |
al@844 | 150 |
pascal@916 | 151 if [ "$AUTO_INSTALL_DEPS" == 'yes' ] || [ -n "$quiet" ]; then |
paul@943 | 152 # Quietly not displaying anything. Assume 'yes' unless '--noconfirm' is provided |
al@844 | 153 answer=0 |
al@913 | 154 [ -n "$noconfirm" ] && answer=1 |
al@844 | 155 else |
al@913 | 156 # Display question; wait for answer or print auto-answer |
al@844 | 157 newline |
al@844 | 158 confirm "$(_ 'Install all missing dependencies? (y/N)')" |
al@844 | 159 answer=$? |
al@844 | 160 newline |
al@844 | 161 fi |
al@844 | 162 debug " answer='$answer'" |
al@844 | 163 |
al@844 | 164 dir="$(dirname "$1")" |
al@844 | 165 debug " dir='$dir'" |
al@844 | 166 |
paul@943 | 167 # We can install packages from /home/boot/packages at boot time |
al@844 | 168 # Also we can prefer local packages over mirrored/cached using '--local' option |
al@844 | 169 [ "$dir" == '/home/boot/packages' ] && local='yes' |
al@844 | 170 debug " local='$local'" |
al@844 | 171 |
al@844 | 172 # "--nodeps" option prevents to install dependencies |
al@844 | 173 if [ "$answer" -eq 0 -a -z "$nodeps" ]; then |
al@844 | 174 debug " let's install missing packages" |
al@844 | 175 for pkg in $missing_packages; do |
al@844 | 176 debug " pkg='$pkg'" |
al@945 | 177 [ -d "$INSTALLED/$pkg" ] && continue |
al@945 | 178 # Package not installed |
al@844 | 179 |
al@945 | 180 found='0'; namever=''; pkgfile='' |
al@945 | 181 # Prefer local packages |
al@945 | 182 if [ -n "$local" ]; then |
al@945 | 183 [ -z "$quiet" ] && _ 'Checking if package "%s" exists in local list...' "$pkg" |
al@946 | 184 [ -n "$cookmode" ] && dir='/home/slitaz/packages' |
al@946 | 185 pi="$dir/packages.info" |
al@945 | 186 # Find local package |
al@946 | 187 if [ -f "$pi" ]; then |
al@945 | 188 # Packages database exists (should be everfresh!) |
al@945 | 189 namever=$(awk -F$'\t' -vpkg="$pkg" '{ |
al@945 | 190 # if package name or provided package name matched |
al@945 | 191 if (index(" " $1 " " $10 " ", " " pkg " ")) { printf("%s-%s", $1, $2); exit; } |
al@946 | 192 }' "$pi") # <namever> = <package_name>-<package_version> |
al@945 | 193 # Package file may be in form <namever>.tazpkg or <namever>-<arch>.tazpkg, so find one |
al@945 | 194 [ -n "$namever" ] && pkgfile=$(find "$dir" -name "$namever*.tazpkg") |
al@945 | 195 [ -n "$pkgfile" ] && found='1' |
al@945 | 196 else |
al@945 | 197 # Packages DB missing, proceed to sniff packages |
al@890 | 198 tempd="$(mktemp -d)"; cd "$tempd" |
al@890 | 199 for pkgfile in $dir/$pkg-*.tazpkg; do |
al@927 | 200 [ -e "$pkgfile" ] || continue |
al@890 | 201 # Extract receipt from each matched package |
al@890 | 202 cpio -F "$pkgfile" -i receipt >/dev/null 2>&1 |
al@890 | 203 name=$(. receipt; echo $PACKAGE) |
al@945 | 204 [ "$name" == "$pkg" ] && found='1' && break |
al@945 | 205 # Install the first matched package: normally there is only one package |
al@945 | 206 # with the $PACKAGE matched in the receipt |
al@890 | 207 rm receipt |
al@890 | 208 done |
al@890 | 209 rm -r "$tempd" |
al@844 | 210 fi |
al@945 | 211 fi |
al@945 | 212 debug " found='$found'" |
al@844 | 213 |
al@945 | 214 if [ "$found" -eq 1 ] |
al@945 | 215 then tazpkg install "$pkgfile" |
al@945 | 216 else tazpkg get-install "$pkg" |
al@844 | 217 fi |
al@844 | 218 done |
al@844 | 219 else |
al@844 | 220 # Answered 'No' to install dependencies, or '--nodeps' option given |
al@844 | 221 newline |
al@844 | 222 _ 'Leaving dependencies for package "%s" unresolved.' "$PACKAGE" |
al@845 | 223 _ 'The package will be installed but will probably not work.' |
al@844 | 224 newline |
al@844 | 225 fi |
al@844 | 226 } |
al@844 | 227 |
al@844 | 228 |
al@844 | 229 # Extract a package with cpio and gzip/lzma. |
al@844 | 230 |
al@844 | 231 extract_package() { |
al@844 | 232 # input: $1 - path to package to be extracted; package should be in the current dir |
al@844 | 233 # ROOT INDEPENDENT |
al@880 | 234 action 'Extracting package...' |
al@844 | 235 |
al@844 | 236 # Extract "outer layer": cpio; remove the original package file |
al@844 | 237 cpio -idm --quiet < "$1" && rm -f "$1" |
al@844 | 238 |
al@844 | 239 # "Inner layer" may vary |
al@844 | 240 if [ -f fs.cpio.lzma ]; then |
al@844 | 241 # "Plain" cpio.lzma |
al@844 | 242 unlzma < fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma |
al@844 | 243 elif [ -f fs.cpio.gz ]; then |
al@844 | 244 # "Fast" cpio.gz (used to pack-then-install process in most of get-packages) |
al@844 | 245 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz |
al@844 | 246 fi |
al@844 | 247 |
al@880 | 248 status |
al@844 | 249 } |
al@844 | 250 |
al@844 | 251 |
al@844 | 252 # Print short package description |
al@844 | 253 |
al@844 | 254 print_short_description() { |
al@844 | 255 # TODO: undigest repo support? priority... |
al@844 | 256 # ROOT READY |
al@844 | 257 local short_desc='' |
al@844 | 258 |
al@844 | 259 # Try to find localized short description |
al@844 | 260 for LC in $LANG ${LANG%_*}; do |
al@844 | 261 [ -e "$PKGS_DB/packages-desc.$LC" ] && |
al@844 | 262 short_desc=$(awk -F$'\t' -vp="$1" '$1==p{print $2; exit}' "$PKGS_DB/packages-desc.$LC") |
al@844 | 263 done |
al@844 | 264 |
al@844 | 265 # Try to find short description for mirrored package |
al@844 | 266 [ -z "$short_desc" -a -s "$PKGS_DB/packages.info" ] && |
al@844 | 267 short_desc=$(awk -F$'\t' -vp="$1" '$1==p{print $4; exit}' "$PKGS_DB/packages.info") |
al@844 | 268 |
al@844 | 269 [ -z "$short_desc" ] && short_desc="$SHORT_DESC" |
al@844 | 270 |
al@844 | 271 longline "$short_desc" |
al@844 | 272 } |
al@844 | 273 |
al@844 | 274 |
al@844 | 275 grepesc() { |
al@844 | 276 sed 's/\[/\\[/g' |
al@844 | 277 } |
al@844 | 278 |
al@844 | 279 |
al@844 | 280 |
al@844 | 281 |
al@844 | 282 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* |
al@844 | 283 |
al@844 | 284 # Block of receipt function callers |
al@844 | 285 # Why? "Bad" receipt sourcing can redefine some vital TazPkg variables. |
paul@943 | 286 # Few receipts functions should be patched now. |
al@844 | 287 |
al@844 | 288 # Input: $1 = path to the receipt to be processed |
al@844 | 289 |
al@844 | 290 # Pre-install commands |
al@844 | 291 call_pre_install() { |
al@844 | 292 local tmp |
al@844 | 293 if grep -q '^pre_install()' "$1"; then |
al@880 | 294 action 'Execute pre-install commands...' |
al@844 | 295 tmp="$(mktemp)" |
al@844 | 296 cp "$1" "$tmp" |
al@844 | 297 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp" |
al@844 | 298 ( . "$tmp"; pre_install "$root" ) |
al@880 | 299 status |
al@844 | 300 rm "$tmp" |
al@844 | 301 fi |
al@844 | 302 |
al@844 | 303 } |
al@846 | 304 # Post-install commands |
al@844 | 305 call_post_install() { |
al@844 | 306 local tmp |
al@844 | 307 if grep -q '^post_install()' "$1"; then |
al@880 | 308 action 'Execute post-install commands...' |
al@844 | 309 tmp="$(mktemp)" |
al@844 | 310 cp "$1" "$tmp" |
al@844 | 311 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp" |
al@844 | 312 ( . "$tmp"; post_install "$root" ) |
al@880 | 313 status |
al@844 | 314 rm "$tmp" |
al@844 | 315 fi |
al@844 | 316 } |
al@844 | 317 |
al@844 | 318 |
al@844 | 319 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* |
al@844 | 320 |
al@844 | 321 |
al@844 | 322 # This function installs a package in the rootfs. |
al@844 | 323 |
al@844 | 324 install_package() { |
al@844 | 325 # input: $1 = path to package to be installed |
al@844 | 326 # dep: install_all_deps, print_short_description, extract_package, grepesc. |
al@844 | 327 |
al@844 | 328 debug "\ninstall_package('$1')" |
al@844 | 329 local dir |
al@844 | 330 |
al@844 | 331 PACKAGE_FILE="$1" |
al@844 | 332 TMP_DIR="$(mktemp -d)" |
al@844 | 333 |
al@844 | 334 # Get receipt's variables and functions |
al@844 | 335 { cd "$TMP_DIR"; cpio --quiet -i receipt >/dev/null 2>&1; } < "$PACKAGE_FILE" |
al@844 | 336 # Why next code? "Bad" receipt sourcing can redefine some vital TazPkg variables. |
al@844 | 337 ( |
al@844 | 338 . "$TMP_DIR/receipt" |
al@844 | 339 cat > "$TMP_DIR/receipt.var" <<EOT |
al@844 | 340 PACKAGE="$PACKAGE" |
al@844 | 341 VERSION="$VERSION" |
al@844 | 342 EXTRAVERSION="$EXTRAVERSION" |
al@844 | 343 CATEGORY="$CATEGORY" |
al@945 | 344 SHORT_DESC="${SHORT_DESC//\"/\"}" |
al@844 | 345 WEB_SITE="$WEB_SITE" |
al@844 | 346 TAGS="$TAGS" |
al@844 | 347 DEPENDS="$DEPENDS" |
al@844 | 348 CONFIG_FILES="$CONFIG_FILES" |
al@844 | 349 PACKED_SIZE="$PACKED_SIZE" |
al@844 | 350 UNPACKED_SIZE="$UNPACKED_SIZE" |
al@844 | 351 EOT |
al@844 | 352 rm "$TMP_DIR/receipt" |
al@844 | 353 ) |
al@844 | 354 . "$TMP_DIR/receipt.var" |
al@844 | 355 |
al@844 | 356 |
al@844 | 357 # Make sure folder exists on new installs or upgrades |
al@844 | 358 mkdir -p "$INSTALLED/$PACKAGE" |
al@844 | 359 |
al@844 | 360 # Keep "modifiers" and "files.list" on upgrade |
al@844 | 361 find "$INSTALLED/$PACKAGE" -type f \( ! -name modifiers ! -name files.list \) -delete |
al@844 | 362 |
al@844 | 363 # Update "installed.md5" |
al@844 | 364 # TODO: discontinue using 'installed.md5' |
al@844 | 365 touch "$PKGS_DB/installed.$SUM" |
al@844 | 366 sed -i "/ $(basename "$PACKAGE_FILE")$/d" "$PKGS_DB/installed.$SUM" 2>/dev/null |
al@844 | 367 cd "$(dirname "$PACKAGE_FILE")" |
al@844 | 368 $CHECKSUM "$(basename "$PACKAGE_FILE")" >> "$PKGS_DB/installed.$SUM" |
al@844 | 369 |
al@844 | 370 # Resolve package dependencies before package installation |
al@844 | 371 install_all_deps "$PACKAGE_FILE" |
al@844 | 372 |
al@844 | 373 |
al@844 | 374 # TODO: why this list-processed in the $PKGS_DB? |
al@844 | 375 #[ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> "$PKGS_DB/$INSTALL_LIST-processed" |
al@844 | 376 |
paul@943 | 377 # Special mode for using in cookutils: clearly show whether freshly used package or cached one |
al@933 | 378 if [ -n "$cookmode" ]; then |
al@933 | 379 f=${PACKAGE_FILE%/*}; f=${f%/*}; f=${f##*/} |
al@933 | 380 if [ "$f" == "$(cat /etc/slitaz-release)" ]; then |
al@933 | 381 _ 'Installing (web/cache): %s' "$(basename $PACKAGE_FILE .tazpkg)" |
al@933 | 382 else |
al@933 | 383 _ 'Installing (pkg/local): %s' "$(basename $PACKAGE_FILE .tazpkg)" |
al@933 | 384 fi |
al@933 | 385 fi |
al@933 | 386 |
al@844 | 387 if [ -n "$sequence" ]; then |
al@880 | 388 title 'Installation of package "%s" (%s)' "$PACKAGE" "$sequence" |
al@844 | 389 else |
al@880 | 390 title 'Installation of package "%s"' "$PACKAGE" |
al@844 | 391 fi |
al@844 | 392 |
al@876 | 393 if [ -z "$quiet" ]; then |
al@876 | 394 print_short_description "$PACKAGE" |
al@876 | 395 separator '-' |
al@876 | 396 fi |
al@844 | 397 |
al@880 | 398 action 'Copying package...' |
al@844 | 399 cp "$PACKAGE_FILE" "$TMP_DIR" |
al@880 | 400 status |
al@844 | 401 |
al@844 | 402 cd "$TMP_DIR" |
al@844 | 403 extract_package "$(basename "$PACKAGE_FILE")" |
al@844 | 404 |
al@844 | 405 # Include temporary receipt to get the right variables |
al@844 | 406 . "$TMP_DIR/receipt.var" |
al@844 | 407 |
al@844 | 408 cd "$INSTALLED" |
al@844 | 409 |
al@844 | 410 |
al@844 | 411 # Get files to remove if upgrading |
al@844 | 412 # IFS here modified temporarily for processing filenames with spaces |
al@844 | 413 IFS=$'\n' |
al@844 | 414 if [ -f "$PACKAGE/files.list" ]; then |
al@844 | 415 while read file; do |
al@844 | 416 grep -q "^$(echo "$file" | grepesc)$" "$TMP_DIR/files.list" && continue |
al@844 | 417 for i in $(cat "$PACKAGE/modifiers" 2>/dev/null; |
al@844 | 418 fgrep -sl "$PACKAGE" */modifiers | cut -d/ -f1); do |
al@844 | 419 grep -qs "^$(echo "$file" | grepesc)$" "$i/files.list" && continue 2 |
al@844 | 420 done |
al@844 | 421 echo "$file" |
al@844 | 422 done < "$PACKAGE/files.list" > "$TMP_DIR/files2remove.list" |
al@844 | 423 fi |
al@844 | 424 unset IFS |
al@844 | 425 |
al@844 | 426 |
al@844 | 427 # Remember modified packages |
al@880 | 428 action 'Remember modified packages...' |
al@844 | 429 { |
al@844 | 430 check=false |
al@844 | 431 # TODO: why '[' the special? |
al@844 | 432 # FIXME: we have files with spaces in our packages! |
al@844 | 433 for i in $(fgrep -v [ $TMP_DIR/files.list); do |
al@844 | 434 [ -e "$root$i" ] || continue |
al@844 | 435 [ -d "$root$i" ] && continue |
al@844 | 436 echo "- $i" |
al@844 | 437 check=true |
al@844 | 438 done ; |
al@844 | 439 $check && \ |
al@844 | 440 for i in *; do |
al@844 | 441 [ "$i" == "$PACKAGE" ] && continue |
al@844 | 442 [ -s "$i/files.list" ] || continue |
al@844 | 443 awk "{ printf \"$i %s\\n\",\$1 }" < "$i/files.list" |
al@844 | 444 done; |
al@844 | 445 } | awk ' |
al@844 | 446 { |
al@844 | 447 if ($1 == "-" || file[$2] != "") { |
al@844 | 448 file[$2] = file[$2] " " $1 |
al@844 | 449 if ($1 != "-") { |
al@844 | 450 if (pkg[$1] == "") all = all " " $1 |
al@844 | 451 pkg[$1] = pkg[$1] " " $2 |
al@844 | 452 } |
al@844 | 453 } |
al@844 | 454 } |
al@844 | 455 END { |
al@844 | 456 for (i = split(all, p, " "); i > 0; i--) |
al@844 | 457 for (j = split(pkg[p[i]], f, " "); j > 0; j--) |
al@844 | 458 printf "%s %s\n",p[i],f[j]; |
al@844 | 459 } |
al@844 | 460 ' | while read dir file; do |
al@844 | 461 if grep -qs "^$dir$" "$PACKAGE/modifiers"; then |
al@844 | 462 # Do not overload an overloaded file ! |
al@844 | 463 rm "$TMP_DIR/$file" 2>/dev/null |
al@844 | 464 continue |
al@844 | 465 fi |
al@844 | 466 grep -qs "^$PACKAGE$" "$dir/modifiers" && continue |
al@844 | 467 if [ -s "$dir/volatile.cpio.gz" ]; then |
al@844 | 468 # We can modify backed up files without notice |
al@844 | 469 zcat "$dir/volatile.cpio.gz" | cpio -t --quiet | \ |
al@844 | 470 grep -q "^${file#/}$" && continue |
al@844 | 471 fi |
al@844 | 472 echo "$PACKAGE" >> "$dir/modifiers" |
al@844 | 473 done |
al@880 | 474 status |
al@844 | 475 |
al@844 | 476 |
al@844 | 477 cd "$TMP_DIR" |
al@844 | 478 # Copy receipt, etc. |
al@844 | 479 for file in receipt files.list description.txt $CHECKSUM; do |
al@844 | 480 [ -f "$file" ] && cp "$file" "$INSTALLED/$PACKAGE" |
al@844 | 481 done |
al@844 | 482 |
al@844 | 483 |
al@844 | 484 # Pre-install commands |
al@844 | 485 call_pre_install "$INSTALLED/$PACKAGE/receipt" |
al@844 | 486 |
al@844 | 487 |
al@844 | 488 if [ -n "$CONFIG_FILES" ]; then |
al@844 | 489 # Save "official" configuration files |
al@880 | 490 action 'Saving configuration files...' |
al@844 | 491 debug "\n" |
al@844 | 492 |
al@844 | 493 cd fs |
al@844 | 494 local config_file |
al@844 | 495 for config_file in $CONFIG_FILES; do |
al@844 | 496 debug " config_file: '$config_file'" |
al@844 | 497 find ${config_file#/} -type f 2>/dev/null |
al@844 | 498 done | cpio -o -H newc --quiet | gzip -9 > "$INSTALLED/$PACKAGE/volatile.cpio.gz" |
al@844 | 499 cd .. |
al@844 | 500 |
al@844 | 501 if [ -z "$newconf" ]; then |
al@844 | 502 debug " no '--newconf': clean official config files" |
al@844 | 503 # Keep user configuration files: remove "official" from fs tree |
al@844 | 504 for config_file in $CONFIG_FILES; do |
al@888 | 505 for config_file_official in $(find "fs$config_file" ! -type d 2>/dev/null | sed 's|^fs||'); do |
al@855 | 506 if [ -e "$root$config_file_official" ]; then |
al@855 | 507 debug " official '$config_file_official' will be skipped" |
al@855 | 508 rm "fs$config_file_official" |
al@855 | 509 else |
al@855 | 510 debug " official '$config_file_official' will be written" |
al@855 | 511 fi |
al@855 | 512 done |
al@844 | 513 done |
al@844 | 514 fi |
al@844 | 515 # always '[ Done ]' status, unless '--newconf' is passed or not |
al@880 | 516 :; status |
al@844 | 517 fi |
al@844 | 518 |
al@844 | 519 |
al@846 | 520 if [ -n "$(ls fs/* 2>/dev/null)" ]; then |
al@880 | 521 action 'Installing package...' |
al@845 | 522 |
al@845 | 523 debug '\n resolving destination links in source' |
al@845 | 524 IFS=$'\n' |
al@845 | 525 for dir in $(find fs -type d | sed 's|^fs||;/^$/d'); do |
al@846 | 526 if ldir=$(readlink -n $root$dir); then |
al@845 | 527 debug " * mv 'fs$dir'\n -> 'fs${dir%/*}/$ldir'" |
al@845 | 528 mkdir -p "fs${dir%/*}/${ldir%/*}" |
al@845 | 529 mv "fs$dir" "fs${dir%/*}/$ldir" |
al@845 | 530 fi |
al@845 | 531 done |
al@845 | 532 unset IFS |
al@845 | 533 |
al@845 | 534 debug ' copying folders and files to destination' |
al@845 | 535 cp -af fs/* "$root/" |
al@880 | 536 status |
al@845 | 537 fi |
al@844 | 538 |
al@844 | 539 |
al@844 | 540 if [ -s files2remove.list ]; then |
al@880 | 541 action 'Removing old files...' |
al@844 | 542 while read file; do |
al@844 | 543 dir="$root$file" |
al@844 | 544 # Remove specified file |
al@844 | 545 rm -f "$dir" |
al@844 | 546 # Recursive remove non-empty up-dirs |
al@844 | 547 while [ "$dir" != "$root/" ]; do |
al@844 | 548 dir=$(dirname "$dir") |
al@844 | 549 rmdir "$dir" 2>/dev/null || break |
al@844 | 550 done |
al@844 | 551 done < files2remove.list |
al@880 | 552 :; status |
al@844 | 553 fi |
al@844 | 554 |
al@844 | 555 |
al@844 | 556 # Remove the temporary random directory. |
al@880 | 557 action "Removing all tmp files..." |
al@844 | 558 cd ..; rm -rf "$TMP_DIR" |
al@880 | 559 status |
al@844 | 560 |
al@844 | 561 |
al@844 | 562 # Post install commands |
al@844 | 563 call_post_install "$INSTALLED/$PACKAGE/receipt" |
al@844 | 564 |
al@844 | 565 |
al@844 | 566 |
al@844 | 567 |
al@844 | 568 # Update system databases |
al@844 | 569 # Updating DBs is important process, so not to hide such errors (localized): |
al@844 | 570 # chroot: can't execute '/usr/bin/***': No such file or directory |
al@844 | 571 |
al@929 | 572 local fl="$INSTALLED/$PACKAGE/files.list" upd=0 udesk umime uicon uschm ukrnl ukrnlfs |
al@844 | 573 |
al@929 | 574 fgrep /usr/share/applications/ "$fl" | fgrep -q .desktop && udesk='yes' |
al@929 | 575 fgrep -q /usr/share/mime "$fl" && umime='yes' |
al@929 | 576 fgrep -q /usr/share/icon/hicolor "$fl" && uicon='yes' |
al@929 | 577 fgrep /usr/share/glib-2.0/schemas "$fl" | fgrep -q .xml && uschm='yes' |
al@929 | 578 fgrep /usr/lib/gdk-pixbuf "$fl" | fgrep -q .so && upixb='yes' |
al@929 | 579 if fgrep -q /lib/modules "$fl"; then |
al@929 | 580 ukrnl='yes' |
al@929 | 581 if fgrep -q /kernel/fs/ "$fl"; then |
al@929 | 582 ukrnlfs='yes' |
al@929 | 583 fi |
al@929 | 584 fi |
al@844 | 585 |
al@844 | 586 if [ -n "$udesk$umime$uicon$uschm$upixb$ukrnl" ]; then |
al@880 | 587 action 'Update system databases...' |
al@844 | 588 upd=1 |
al@844 | 589 fi |
al@844 | 590 |
al@844 | 591 # package 'desktop-file-utils' |
al@862 | 592 [ -n "$udesk" ] && chroot "$root/" /usr/bin/update-desktop-database /usr/share/applications 2>/dev/null |
al@844 | 593 # package 'shared-mime-info' |
al@844 | 594 [ -n "$umime" ] && chroot "$root/" /usr/bin/update-mime-database /usr/share/mime |
al@844 | 595 # packages 'gtk+', 'gtk+3' |
al@844 | 596 [ -n "$uicon" ] && chroot "$root/" /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor |
al@844 | 597 # package 'glib' |
al@897 | 598 # hide messages like next because they are unresolved (we may to patch glib to hide them, almost the same) |
al@897 | 599 # warning: Schema '*' has path '*'. Paths starting with '/apps/', '/desktop/' or '/system/' are deprecated. |
al@897 | 600 [ -n "$uschm" ] && chroot "$root/" /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas 2>&1 | fgrep -v '/apps/' |
al@844 | 601 # package 'gdk-pixbuf' |
al@844 | 602 [ -n "$upixb" ] && chroot "$root/" /usr/bin/gdk-pixbuf-query-loaders --update-cache |
al@929 | 603 |
al@929 | 604 if [ -n "$ukrnlfs" ]; then |
al@929 | 605 for i in $(awk -F/ '{if($6=="fs" && $8~$7)print $7}' "$fl" | sort -u); do |
al@929 | 606 touch "$root/etc/filesystems" |
al@939 | 607 grep -q "^$i\$" "$root/etc/filesystems" || echo "$i" >> "$root/etc/filesystems" |
al@929 | 608 done |
al@929 | 609 fi |
al@844 | 610 # packages 'busybox', 'kmod', 'depmod' |
al@865 | 611 [ -n "$ukrnl" ] && grep '/lib/modules' "$fl" | cut -d'/' -f4 | uniq | xargs chroot "$root/" /sbin/depmod -a |
al@844 | 612 |
al@880 | 613 [ "$upd" -eq 1 ] && status |
al@844 | 614 |
al@844 | 615 |
al@844 | 616 |
al@844 | 617 |
al@949 | 618 # Update installed.info ---------------------------------------------------- |
al@844 | 619 SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g') |
al@949 | 620 |
al@844 | 621 # Remove newlines from some receipts |
al@844 | 622 DEPENDS=$(echo $DEPENDS) |
al@949 | 623 |
al@949 | 624 # Calculate "release checksum": md5sum of file containing md5sums of: |
al@949 | 625 # a) all files, b) receipt, and c) description.txt. |
al@949 | 626 rsumf=$(mktemp) |
al@949 | 627 cp $INSTALLED/$PACKAGE/md5sum $rsumf |
al@949 | 628 md5sum $INSTALLED/$PACKAGE/receipt | sed 's| [^ ]*/| |' >> $rsumf |
al@949 | 629 [ -e "$INSTALLED/$PACKAGE/description.txt" ] && |
al@949 | 630 md5sum $INSTALLED/$PACKAGE/description.txt | sed 's| [^ ]*/| |' >> $rsumf |
al@949 | 631 RSUM=$(md5sum $rsumf | awk '{print $1}') |
al@949 | 632 rm $rsumf |
al@949 | 633 |
al@844 | 634 ii="$PKGS_DB/installed.info" |
al@949 | 635 |
al@844 | 636 # Remove old entry |
al@844 | 637 sed -i "/^$PACKAGE /d" "$ii" |
al@949 | 638 |
al@844 | 639 cat >> "$ii" <<EOT |
al@949 | 640 $PACKAGE $VERSION$EXTRAVERSION $CATEGORY $SHORT_DESC $WEB_SITE $TAGS $SIZES $DEPENDS $RSUM |
al@844 | 641 EOT |
al@949 | 642 |
al@844 | 643 TEMP_FILE="$(mktemp)" |
al@844 | 644 sort "$ii" > "$TEMP_FILE"; mv -f "$TEMP_FILE" "$ii"; chmod a+r "$ii"; unset ii |
al@949 | 645 # -------------------------------------------------------------------------- |
al@844 | 646 |
al@844 | 647 cd "$CUR_DIR" |
al@880 | 648 footer "$(_ 'Package "%s" (%s) is installed.' "$PACKAGE" "$VERSION$EXTRAVERSION")" |
al@844 | 649 |
al@844 | 650 # Log this activity |
al@844 | 651 log_pkg Installed |
al@844 | 652 |
al@844 | 653 # Remove package from upgrade list |
al@844 | 654 [ -s "$UP_LIST" ] && sed -i "/^$PACKAGE\$/d" "$UP_LIST" |
al@844 | 655 } |
al@844 | 656 |
al@844 | 657 |
al@844 | 658 |
al@844 | 659 |
al@844 | 660 #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* |
al@844 | 661 |
al@844 | 662 |
al@844 | 663 PACKAGE=$( |
al@844 | 664 tmp_dir=$(mktemp -d); cd "$tmp_dir" |
al@844 | 665 cpio --quiet -i receipt >/dev/null 2>&1 |
al@844 | 666 . receipt; echo $PACKAGE |
al@844 | 667 rm -rf "$tmp_dir" |
al@844 | 668 ) < "$1" |
al@844 | 669 |
al@866 | 670 if grep -qs "^$PACKAGE$" "$BLOCKED"; then |
al@866 | 671 _ 'Package "%s" blocked.' "$PACKAGE" |
al@866 | 672 exit 1 |
al@866 | 673 fi |
al@866 | 674 |
al@844 | 675 if [ -z "$forced" ]; then |
al@844 | 676 # Check if a package is already installed |
al@844 | 677 debug "\ncheck for installed package '$PACKAGE'" |
al@844 | 678 |
al@844 | 679 awk -F$'\t' -vpv="$PACKAGE" '$1==pv { exit 1 }' "$PKGS_DB/installed.info" |
al@844 | 680 |
al@844 | 681 if [ "$?" -eq 1 ]; then |
al@881 | 682 if [ -z "$quiet" ]; then |
al@881 | 683 newline |
al@881 | 684 _ '"%s" package is already installed.' "$(colorize 34 "$PACKAGE")" |
al@881 | 685 longline "$(_ 'You can use the --forced option to force installation.')" |
al@881 | 686 newline |
al@881 | 687 fi |
al@844 | 688 exit 1 |
al@844 | 689 fi |
al@844 | 690 fi |
al@844 | 691 |
al@844 | 692 install_package "$(realpath "$1")" |