spk annotate lib/libspk.sh @ rev 99
clean several echos in libspk
author | Christian Mesh <meshca@clarkson.edu> |
---|---|
date | Sat Jun 02 17:46:46 2012 -0500 (2012-06-02) |
parents | 0df5690de5fd |
children | f017035fd1f5 |
rev | line source |
---|---|
pankso@5 | 1 #!/bin/sh |
pankso@5 | 2 # |
paul@12 | 3 # Libspk - The Spk base function and internal variables used by almost all |
pankso@5 | 4 # spk-tools. Read the README before adding or modifing any code in spk! |
pankso@5 | 5 # |
pankso@5 | 6 # Copyright (C) SliTaz GNU/Linux - BSD License |
pankso@5 | 7 # Author: See AUTHORS files |
pankso@5 | 8 # |
pankso@5 | 9 . /lib/libtaz.sh |
pankso@5 | 10 . /usr/lib/slitaz/libpkg.sh |
pankso@5 | 11 . /etc/slitaz/slitaz.conf |
pankso@5 | 12 |
pankso@5 | 13 # Internal variables. |
pankso@17 | 14 mirrorurl="${root}${PKGS_DB}/mirror" |
pankso@59 | 15 mirrors="${root}${PKGS_DB}/mirrors" |
pankso@17 | 16 installed="${root}${PKGS_DB}/installed" |
pankso@17 | 17 pkgsdesc="${root}${PKGS_DB}/packages.desc" |
pankso@32 | 18 pkgsmd5="${root}${PKGS_DB}/packages.$SUM" |
pankso@60 | 19 pkgsequiv="${root}${PKGS_DB}/packages.equiv" |
pankso@80 | 20 pkgsup="${root}${PKGS_DB}/packages.up" |
pankso@19 | 21 blocked="${root}${PKGS_DB}/blocked.list" |
pankso@17 | 22 activity="${root}${PKGS_DB}/activity" |
pankso@57 | 23 logdir="${root}/var/log/spk" |
pankso@59 | 24 extradb="${root}${PKGS_DB}/extra" |
pankso@60 | 25 tmpdir="/tmp/spk/$RANDOM" |
pankso@5 | 26 |
pankso@5 | 27 # |
pankso@19 | 28 # Sanity checks |
pankso@19 | 29 # |
pankso@19 | 30 |
pankso@19 | 31 if [ ! -d "${root}${PKGS_DB}" ]; then |
pankso@19 | 32 gettext "Can't find DB:"; echo " ${root}${PKGS_DB}" |
pankso@19 | 33 exit 1 |
pankso@19 | 34 fi |
pankso@19 | 35 |
pankso@80 | 36 if [ ! -d "${root}${extradb}" ]; then |
pankso@80 | 37 mkdir -p ${root}${extradb} |
pankso@80 | 38 fi |
pankso@80 | 39 |
pankso@93 | 40 if [ ! -d "${root}${CACHE_DIR}" ]; then |
pankso@93 | 41 mkdir -p ${root}${CACHE_DIR} |
pankso@93 | 42 fi |
pankso@93 | 43 |
pankso@19 | 44 # |
pankso@5 | 45 # Functions |
pankso@18 | 46 # |
meshca@11 | 47 |
pankso@14 | 48 # Display receipt information. Expects a receipt to be sourced |
pankso@5 | 49 receipt_info() { |
pankso@5 | 50 cat << EOT |
pankso@5 | 51 $(gettext "Version :") ${VERSION}${EXTRAVERSION} |
pankso@5 | 52 $(gettext "Short desc :") $SHORT_DESC |
pankso@5 | 53 $(gettext "Category :") $CATEGORY |
pankso@5 | 54 EOT |
pankso@5 | 55 } |
pankso@5 | 56 |
pankso@62 | 57 # Display package info from a packages.desc list |
pankso@62 | 58 # Usage: read_pkgsdesc /path/to/packages.desc |
pankso@62 | 59 read_pkgsdesc() { |
pankso@62 | 60 local list="$1" |
pankso@62 | 61 IFS="|" |
pankso@62 | 62 cat $list | while read package version desc category |
pankso@62 | 63 do |
pankso@62 | 64 if [ "$short" ]; then |
meshca@99 | 65 colorize 32 "$package"; indent 28 " $version" |
pankso@62 | 66 else |
pankso@62 | 67 newline |
meshca@69 | 68 gettext "Package :"; colorize 32 " $package" |
pankso@62 | 69 gettext "Version :"; echo "$version" |
pankso@62 | 70 gettext "Short desc :"; echo "$desc" |
pankso@62 | 71 fi |
pankso@62 | 72 done && unset IFS |
pankso@62 | 73 } |
pankso@62 | 74 |
meshca@9 | 75 # Extract receipt from tazpkg |
meshca@9 | 76 # Parameters: result_dir package_file |
meshca@9 | 77 extract_receipt() { |
meshca@9 | 78 local dir="$1" |
meshca@9 | 79 local file="$2" |
pankso@26 | 80 cd "$dir" |
meshca@9 | 81 { cpio --quiet -i receipt > /dev/null 2>&1; } < $file |
pankso@26 | 82 cd - >/dev/null |
meshca@9 | 83 } |
meshca@9 | 84 |
pankso@60 | 85 # Extract files.list from tazpkg |
pankso@60 | 86 # Parameters: result_dir package_file |
pankso@60 | 87 extract_fileslist() { |
pankso@60 | 88 local dir="$1" |
pankso@60 | 89 local file="$2" |
pankso@60 | 90 cd "$dir" |
pankso@60 | 91 { cpio --quiet -i files.list > /dev/null 2>&1; } < $file |
pankso@60 | 92 cd - >/dev/null |
pankso@60 | 93 } |
pankso@60 | 94 |
meshca@70 | 95 is_package_installed() { |
slaxemulator@72 | 96 [ -f "$installed/$1/receipt" ] |
meshca@70 | 97 } |
meshca@70 | 98 |
pankso@5 | 99 # Used by: list |
pankso@5 | 100 count_installed() { |
pankso@18 | 101 local count=$(ls $installed | wc -l) |
pankso@60 | 102 gettext "Installed :"; echo " $count" |
pankso@5 | 103 } |
pankso@5 | 104 |
pankso@5 | 105 # Used by: list |
pankso@5 | 106 count_mirrored() { |
pankso@62 | 107 [ -f "$pkgsmd5" ] || return |
meshca@9 | 108 local count=$(cat $pkgsmd5 | wc -l) |
pankso@60 | 109 gettext "Mirrored :"; echo " $count" |
pankso@5 | 110 } |
meshca@9 | 111 |
pankso@63 | 112 # Check if package is on main or extra mirror. |
pankso@63 | 113 mirrored_pkg() { |
pankso@14 | 114 local name=$1 |
pankso@67 | 115 #local find=$(grep "^$name |" $pkgsdesc $extradb/*/*.desc 2>/dev/null) |
pankso@67 | 116 for desc in $(find $extradb $pkgsdesc -name packages.desc); do |
pankso@67 | 117 if grep -q "^$name |" $desc; then |
pankso@67 | 118 db=$(dirname $desc) |
pankso@67 | 119 mirrored=$(grep "^$name |" $desc) |
pankso@67 | 120 mirror=$(cat $db/mirror) |
pankso@67 | 121 break |
pankso@67 | 122 fi |
pankso@67 | 123 done |
meshca@11 | 124 } |
meshca@11 | 125 |
pankso@68 | 126 # Check if the download was sane |
pankso@68 | 127 check_download() { |
pankso@68 | 128 debug "check_download: $file" |
pankso@68 | 129 if ! tail -c 2k $file | fgrep -q 00000000TRAILER; then |
pankso@68 | 130 gettext "Continuing download of:"; echo " $file" |
pankso@68 | 131 download "$file" $mirror |
pankso@68 | 132 fi |
pankso@68 | 133 # Check that the package has the correct checksum |
pankso@68 | 134 local msum=$(fgrep " $package_full" $pkgsmd5) |
pankso@68 | 135 local sum=$($CHECKSUM $file) |
pankso@68 | 136 debug "mirror $SUM : $msum" |
pankso@68 | 137 debug "local $SUM : $sum" |
pankso@68 | 138 if [ "$sum" != "$msum" ]; then |
pankso@68 | 139 rm -f $file && download "$file" $mirror |
pankso@68 | 140 fi |
pankso@68 | 141 } |
pankso@68 | 142 |
meshca@11 | 143 # Download a file trying all mirrors |
pankso@67 | 144 # Usage: file [url|path] |
pankso@65 | 145 # |
paul@98 | 146 # Priority to extra is done by mirrored_pkg which tries first to find the |
pankso@67 | 147 # packages in extra mirror, then on official. |
pankso@65 | 148 # |
meshca@11 | 149 download() { |
pankso@65 | 150 local file=$1 |
pankso@67 | 151 local uri="${2%/}" |
pankso@67 | 152 local pwd=$(pwd) |
pankso@65 | 153 [ "$quiet" ] && local quiet="-q" |
pankso@67 | 154 [ "$cache" ] && local pwd=$CACHE_DIR |
pankso@68 | 155 [ "$get" ] || local pwd=$CACHE_DIR |
pankso@67 | 156 [ "$forced" ] && rm -f $pwd/$file |
pankso@67 | 157 debug "download file: $file" |
pankso@67 | 158 debug "DB: $db" |
paul@98 | 159 # Local mirror ? End by cd to cache we may be installed in. If --get |
pankso@67 | 160 # was used we dl/copy in the current dir. |
pankso@67 | 161 if [ -f "$uri/$file" ]; then |
pankso@68 | 162 [ "$verbose" ] && echo "URI: $uri/" |
pankso@68 | 163 gettext "Using local mirror:"; boldify " $file" |
meshca@69 | 164 [ "$verbose" ] && (gettext "Copying file to:"; colorize 34 " $pwd") |
pankso@67 | 165 cp -f $uri/$file $pwd |
pankso@67 | 166 cd $pwd && return 0 |
pankso@67 | 167 fi |
pankso@67 | 168 # In cache ? Root can use --cache to set destdir. |
pankso@67 | 169 if [ -f "$CACHE_DIR/$file" ]; then |
meshca@69 | 170 gettext "Using cache:"; colorize 34 " ${file%.tazpkg}" |
pankso@67 | 171 return 0 |
pankso@67 | 172 else |
pankso@68 | 173 [ "$verbose" ] && echo "URL: $uri/" |
pankso@68 | 174 if [ "$db" == "$PKGS_DB" ]; then |
pankso@68 | 175 gettext "Using official mirror:" |
pankso@68 | 176 else |
pankso@68 | 177 gettext "Using extra mirror:" |
pankso@68 | 178 fi |
pankso@68 | 179 boldify " $file" |
meshca@69 | 180 [ "$verbose" ] && (gettext "Destination:"; colorize 34 " $pwd") |
pankso@67 | 181 if [ -f "$pwd/$file" ]; then |
paul@98 | 182 echo "File exists: $pwd/$file" && return 0 |
pankso@67 | 183 fi |
pankso@68 | 184 # TODO: be a spider with wget -s to check if package is on mirror, |
pankso@68 | 185 # if not try all official mirrors ? |
pankso@67 | 186 wget $quiet -c $uri/$file -O $CACHE_DIR/$file |
pankso@68 | 187 cd $CACHE_DIR && check_download |
pankso@67 | 188 fi |
pankso@67 | 189 # Be sure the file was fetched. |
pankso@67 | 190 if [ ! -f "$pwd/$file" ] || [ ! -f "$CACHE_DIR/$file" ]; then |
meshca@69 | 191 gettext "ERROR: Missing file:"; colorize 31 " $file" |
pankso@67 | 192 newline && exit 1 |
pankso@67 | 193 fi |
meshca@11 | 194 } |
meshca@11 | 195 |
meshca@71 | 196 # Extract .tazpkg cpio archive into a directory. |
meshca@71 | 197 # Parameters: package_file results_directory |
meshca@71 | 198 extract_package() { |
meshca@71 | 199 local package_file=$1 |
meshca@71 | 200 local target_dir=$2 |
meshca@71 | 201 |
meshca@71 | 202 # Validate the file |
pankso@78 | 203 #check_valid_tazpkg $package_file |
meshca@71 | 204 |
meshca@71 | 205 # Find the package name |
meshca@71 | 206 local package_name=$(package_name $package_file) |
meshca@71 | 207 |
pankso@78 | 208 # Create destination directory and copy package |
meshca@71 | 209 local dest_dir=$(pwd)/$package_name |
meshca@71 | 210 [ -n "$target_dir" ] && dest_dir=$target_dir/$package_name |
meshca@71 | 211 mkdir -p $dest_dir |
pankso@78 | 212 cp $package_file $dest_dir |
meshca@71 | 213 |
pankso@78 | 214 cd $dest_dir |
meshca@73 | 215 size=$(du -sh $package_file | awk '{print $1}') |
meshca@71 | 216 echo -n $(gettext "Extracting archive"): $size |
meshca@71 | 217 cpio -idm --quiet < ${package_file##*/} |
meshca@71 | 218 rm -f ${package_file##*/} |
meshca@71 | 219 unlzma -c fs.cpio.lzma | cpio -idm --quiet |
meshca@71 | 220 rm fs.cpio.lzma |
meshca@71 | 221 status |
meshca@71 | 222 cd - > /dev/null |
meshca@71 | 223 } |
meshca@71 | 224 |
pankso@68 | 225 # Unser var set by mirrored_pkg |
pankso@68 | 226 unset_mirrored() { |
pankso@68 | 227 unset mirrored mirror db pwd |
pankso@68 | 228 } |
pankso@68 | 229 |
pankso@66 | 230 # Return the full package name, search in all packages.desc and break when |
pankso@66 | 231 # first occurance is found: Usage: full_package pkgname |
meshca@11 | 232 full_package() { |
pankso@66 | 233 for desc in $(find $extradb $pkgsdesc -name packages.desc); do |
pankso@66 | 234 local line="$(grep "^$1 |" $desc)" |
pankso@66 | 235 if grep -q "^$1 |" $desc; then |
pankso@66 | 236 IFS="|" |
pankso@66 | 237 echo $line | busybox awk '{print $1 "-" $2 ".tazpkg"}' |
pankso@66 | 238 unset IFS && break |
pankso@66 | 239 fi |
pankso@66 | 240 done |
meshca@11 | 241 } |
meshca@11 | 242 |
meshca@11 | 243 # Check if a package is already installed. |
pankso@27 | 244 # Usage: check_installed package |
pankso@27 | 245 check_installed() { |
pankso@14 | 246 local name="$1" |
pankso@18 | 247 if [ -d "$installed/$name" ]; then |
meshca@99 | 248 boldify "$name"; gettext "package is already installed" |
pankso@55 | 249 [ "$forced" ] || rm -rf $tmpdir |
pankso@28 | 250 continue |
meshca@11 | 251 fi |
meshca@11 | 252 } |
meshca@11 | 253 |
meshca@11 | 254 # get an already installed package from packages.equiv TODO REDO! |
meshca@9 | 255 equivalent_pkg() { |
pankso@66 | 256 for i in $(grep -hs "^$1=" $pkgsequiv $extradb/*/*.equiv | sed "s/^$1=//") |
meshca@9 | 257 do |
meshca@9 | 258 if echo $i | fgrep -q : ; then |
meshca@9 | 259 # format 'alternative:newname' |
meshca@9 | 260 # if alternative is installed then substitute newname |
pankso@18 | 261 if [ -f $installed/${i%:*}/receipt ]; then |
meshca@9 | 262 # substitute package dependancy |
meshca@9 | 263 echo ${i#*:} |
meshca@9 | 264 return |
meshca@9 | 265 fi |
meshca@9 | 266 else |
meshca@9 | 267 # if alternative is installed then nothing to install |
pankso@18 | 268 if [ -f $installed/$i/receipt ]; then |
meshca@9 | 269 # substitute installed package |
meshca@9 | 270 echo $i |
meshca@9 | 271 return |
meshca@9 | 272 fi |
meshca@9 | 273 fi |
meshca@9 | 274 done |
meshca@9 | 275 # if not found in packages.equiv then no substitution |
meshca@9 | 276 echo $1 |
meshca@9 | 277 } |
meshca@9 | 278 |
meshca@9 | 279 # Check for missing deps listed in a receipt packages. |
meshca@9 | 280 # Parameters: package dependencies |
meshca@9 | 281 missing_deps() { |
meshca@9 | 282 local package="$1" |
meshca@9 | 283 shift 1 |
meshca@9 | 284 local depends="$@" |
pankso@10 | 285 |
meshca@9 | 286 local deps=0 |
meshca@9 | 287 local missing |
pankso@10 | 288 |
paul@12 | 289 # Calculate missing dependencies |
meshca@9 | 290 for pkgorg in $depends; do |
meshca@9 | 291 local pkg=$(equivalent_pkg $pkgorg) |
pankso@18 | 292 if [ ! -d "$installed/$pkg" ]; then |
pankso@30 | 293 gettext "Missing:"; echo " $pkg" |
meshca@9 | 294 deps=$(($deps+1)) |
pankso@18 | 295 elif [ ! -f "$installed/$pkg/receipt" ]; then |
pankso@56 | 296 gettext "WARNING: Dependency loop between:"; newline |
pankso@56 | 297 echo " $package --> $pkg" |
meshca@9 | 298 fi |
meshca@9 | 299 done |
pankso@14 | 300 |
meshca@99 | 301 gettext "Missing dependencies:"; colorize 34 " $deps" |
pankso@10 | 302 |
meshca@9 | 303 # Return true if missing deps |
meshca@9 | 304 [ "$deps" != "0" ] |
meshca@9 | 305 } |
meshca@11 | 306 |
meshca@11 | 307 grepesc() { |
meshca@11 | 308 sed 's/\[/\\[/g' |
meshca@11 | 309 } |
meshca@11 | 310 |
pankso@27 | 311 # Check for ELF file |
pankso@27 | 312 is_elf() { |
pankso@27 | 313 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ] |
pankso@27 | 314 } |
pankso@66 | 315 |
paul@98 | 316 # Exec functions directly for developement purposes. |
pankso@66 | 317 case $1 in |
pankso@66 | 318 *_*) func=$1 && shift && $func $@ ;; |
pankso@66 | 319 esac |