spk annotate spk-mirror @ rev 61

Add: spk-mirror (Handle official and extra mirrors, create packages list from a directory
author Christophe Lincoln <pankso@slitaz.org>
date Thu May 17 23:41:42 2012 +0200 (2012-05-17)
parents
children 36c7fb7707d0
rev   line source
pankso@61 1 #!/bin/sh
pankso@61 2 #
pankso@61 3 # Spk-mirror - Handle SliTaz packages mirrors. Read the README before
pankso@61 4 # adding or modifing any code in spk!
pankso@61 5 #
pankso@61 6 # Copyright (C) SliTaz GNU/Linux - BSD License
pankso@61 7 # Author: See AUTHORS files
pankso@61 8 #
pankso@61 9 . /usr/lib/slitaz/libspk.sh
pankso@61 10
pankso@61 11 # NOTE: I want to use 'extra' mirrors since we can add any extra mirror
pankso@61 12 # URL's and not only undigest. See also undigest command - Pankso
pankso@61 13
pankso@61 14 #
pankso@61 15 # Functions
pankso@61 16 #
pankso@61 17
pankso@61 18 # Help and usage
pankso@61 19 usage() {
pankso@61 20 name=$(basename $0)
pankso@61 21 cat << EOT
pankso@61 22
pankso@61 23 $(boldify $(gettext "Usage:")) $name [urls|info|--options]
pankso@61 24
pankso@61 25 $(gettext "Handle SliTaz packages mirrors")
pankso@61 26
pankso@61 27 $(boldify $(gettext "Options:"))
pankso@61 28 --list
pankso@61 29 --rm
pankso@61 30 --nodb
pankso@61 31 --extra
pankso@61 32 --debug
pankso@61 33
pankso@61 34 $(boldify $(gettext "Examples:"))
pankso@61 35 $name http://mirror.slitaz.org/
pankso@61 36 $name /path/to/packages --nodb --extra
pankso@61 37
pankso@61 38 EOT
pankso@61 39 exit 0
pankso@61 40 }
pankso@61 41
pankso@61 42 # Check if we have packages ID and lists on mirror.
pankso@61 43 check_mirror() {
pankso@61 44 for file in packages.list packages.$SUM packages.desc ID
pankso@61 45 do
pankso@61 46 gettext "Checking file:"; echo -n " $file"
pankso@61 47 if ! wget -q -s -T 6 ${1}${list} 2>/dev/null; then
pankso@61 48 newline
pankso@61 49 gettext "Unable to reach:"; colorize " $file" 31
pankso@61 50 newline && return 1
pankso@61 51 fi
pankso@61 52 status
pankso@61 53 done
pankso@61 54 }
pankso@61 55
pankso@61 56 # Get extra mirror DB path
pankso@61 57 extra_db() {
pankso@61 58 db=$(echo ${url#*://} | cut -d "/" -f1 )
pankso@61 59 debug "extra mirror: $url"
pankso@61 60 debug "extra DB: $db"
pankso@61 61 }
pankso@61 62
pankso@61 63 # Add a package to lists
pankso@61 64 addto_list() {
pankso@61 65 cd $pkgsdir
pankso@61 66 echo "$PACKAGE-${VERSION}${EXTRAVERSION}" >> packages.list
pankso@61 67 $CHECKSUM $(basename $pkg) >> packages.$SUM
pankso@61 68 #
pankso@61 69 # Add PACKED_SIZE UNPACKED_SIZE to be used to know packages size
pankso@61 70 # before installing ??? --> actually done via packages.txt
pankso@61 71 #
pankso@61 72 cat >> packages.desc << EOT
pankso@61 73 $PACKAGE | ${VERSION}${EXTRAVERSION} | $SHORT_DESC | $CATEGORY | $WEBSITE"
pankso@61 74 EOT
pankso@61 75 # packages.equiv is used by tazpkg install to check depends.
pankso@61 76 touch packages.equiv
pankso@61 77 for i in $PROVIDE; do
pankso@61 78 dest=""
pankso@61 79 echo $i | fgrep -q : && dest="${i#*:}:"
pankso@61 80 if grep -qs ^${i%:*}= packages.equiv; then
pankso@61 81 sed -i "s/^${i%:*}=/${i%:*}=${dest}$PACKAGE /" packages.equiv
pankso@61 82 else
pankso@61 83 echo "${i%:*}=${dest}$PACKAGE" >> packages.equiv
pankso@61 84 fi
pankso@61 85 done
pankso@61 86 # files.list provides a list of all packages files.
pankso@61 87 cat $tmpdir/files.list | sed s/^/"$PACKAGE: \0"/ >> $pkgsdir/files.list
pankso@61 88 }
pankso@61 89
pankso@61 90 #
pankso@61 91 # Commands
pankso@61 92 #
pankso@61 93
pankso@61 94 cmd=$1
pankso@61 95 [ -d "$cmd" ] && cmd=continue
pankso@61 96
pankso@61 97 case "$cmd" in
pankso@61 98 *usage|*help) usage ;;
pankso@61 99 http://*|ftp://|'continue') continue ;;
pankso@61 100 undigest)
pankso@61 101 echo "TODO: enable official undigest repo" ;;
pankso@61 102 ""|--list)
pankso@61 103 extra=0
pankso@61 104 excolor=32
pankso@61 105 newline
pankso@61 106 boldify "Mirror info"
pankso@61 107 separator
pankso@61 108 gettext "Main URL :"
pankso@61 109 boldify " $(cat $mirrorurl)"
pankso@61 110 if [ -f "$mirrors" ]; then
pankso@61 111 nb=$(cat $mirrors | wc -l)
pankso@61 112 gettext "Mirrors :"; colorize " $nb " $excolor
pankso@61 113 fi
pankso@61 114 if [ -d "$extradb" ]; then
pankso@61 115 extra=$(ls $extradb | wc -l)
pankso@61 116 fi
pankso@61 117 [ "$extra" != 0 ] || excolor=31
pankso@61 118 gettext "Extra :"; colorize " $extra" $excolor
pankso@61 119 separator
pankso@61 120 newline
pankso@61 121 if [ "$list" ]; then
pankso@61 122 boldify $(gettext "Official mirrors")
pankso@61 123 separator
pankso@61 124 cat $mirrors
pankso@61 125 separator && newline
pankso@61 126 if [ "$extra" != "0" ]; then
pankso@61 127 boldify $(gettext "Extra mirrors")
pankso@61 128 separator
pankso@61 129 cat $extradb/*/mirror
pankso@61 130 separator && newline
pankso@61 131 fi
pankso@61 132 fi
pankso@61 133 exit 0 ;;
pankso@61 134 esac
pankso@61 135
pankso@61 136 #
pankso@61 137 # Handle all urls
pankso@61 138 #
pankso@61 139
pankso@61 140 count=0
pankso@61 141
pankso@61 142 for url in $@
pankso@61 143 do
pankso@61 144 [ -d "$url" ] && url="dir:$url"
pankso@61 145 case "$url" in
pankso@61 146 http://*|ftp://)
pankso@61 147 [ "$count" == 0 ] && newline
pankso@61 148 count=$(($count + 1))
pankso@61 149 url="${url%/}/"
pankso@61 150 debug "checking: $url"
pankso@61 151 # Remove extra on --rm
pankso@61 152 if [ "$rm" ]; then
pankso@61 153 extra_db
pankso@61 154 if [ -d "$extradb/$db" ]; then
pankso@61 155 gettext "Removing extra mirror:"
pankso@61 156 echo -n " $(boldify "$db")"
pankso@61 157 rm -rf $extradb/$db && status
pankso@61 158 else
pankso@61 159 gettext "Not an extra mirror:"; colorize " $db" 31
pankso@61 160 fi
pankso@61 161 newline && continue
pankso@61 162 fi
pankso@61 163 # Official mirror
pankso@61 164 if fgrep -q "$url" $mirrors; then
pankso@61 165 gettext "Enabling: official mirror"; newline
pankso@61 166 gettext "Architecture:"; echo " $SLITAZ_ARCH"
pankso@61 167 # Handle arch type
pankso@61 168 case "$SLITAZ_ARCH" in
pankso@61 169 arm|x86_64) arch="$SLITAZ_ARCH/" ;;
pankso@61 170 i486) arch="/" ;;
pankso@61 171 esac
pankso@61 172 url=${url}packages/${SLITAZ_RELEASE}${arch}
pankso@61 173 echo "URL: $(boldify "$url")"
pankso@61 174 echo "$url" > $mirrorurl
pankso@61 175 newline && continue
pankso@61 176 fi
pankso@61 177 # Extra mirror
pankso@61 178 extra_db
pankso@61 179 if [ -d "$extradb/$db" ]; then
pankso@61 180 gettext "Extra mirror already exist"; newline
pankso@61 181 echo -n "DB:"; boldify " $db"
pankso@61 182 else
pankso@61 183 gettext "Enabling: extra mirror"; newline
pankso@61 184 echo "URL: $(boldify "$url")"
pankso@61 185 if ! check_mirror $url; then
pankso@61 186 continue
pankso@61 187 fi
pankso@61 188 mkdir -p $extradb/$db
pankso@61 189 echo "$url" > $extradb/$db/mirror
pankso@61 190 gettext "New extra mirror is ready to use"; newline
pankso@61 191 fi
pankso@61 192 newline ;;
pankso@61 193 dir:*)
pankso@61 194 # Handle local mirror
pankso@61 195 dir=${url#dir:}
pankso@61 196 pkgsdir=${dir%/}
pankso@61 197 debug "dir: $dir"
pankso@61 198 nb=$(ls $pkgsdir/*.tazpkg 2>/dev/null | wc -l)
pankso@61 199 if [ "$nb" == 0 ]; then
pankso@61 200 gettext "No packages found in:"; boldify " $pkgsdir"
pankso@61 201 continue
pankso@61 202 fi
pankso@61 203 newline
pankso@61 204 gettext "Directory:"; boldify " $pkgsdir"
pankso@61 205 gettext "Packages :"; colorize " $nb" 32
pankso@61 206 cd $pkgsdir
pankso@61 207 if [ ! "$nodb" ]; then
pankso@61 208 time=$(date +%s)
pankso@61 209 rm -f packages.* ID
pankso@61 210 newline
pankso@61 211 boldify $(gettext "Creating packages lists")
pankso@61 212 separator
pankso@61 213 for pkg in $pkgsdir/*.tazpkg
pankso@61 214 do
pankso@61 215 gettext "Extracting data:"; echo -n " $(basename $pkg)"
pankso@61 216 mkdir -p $tmpdir
pankso@61 217 extract_receipt $tmpdir $pkg
pankso@61 218 extract_fileslist $tmpdir $pkg
pankso@61 219 source $tmpdir/receipt
pankso@61 220 addto_list && status
pankso@61 221 unset_receipt
pankso@61 222 rm -rf $tmpdir
pankso@61 223 done
pankso@61 224 # files.list.lzma
pankso@61 225 gettext "Compressing the files.list..."
pankso@61 226 lzma e files.list files.list.lzma
pankso@61 227 rm -f files.list
pankso@61 228 status
pankso@61 229 # ID
pankso@61 230 gettext "Creating uniq identity ID..."
pankso@61 231 $CHECKSUM packages.$SUM | cut -d ' ' -f 1 > ID
pankso@61 232 status
pankso@61 233 # Summary
pankso@61 234 separator
pankso@61 235 time=$(($(date +%s) - $time))
pankso@61 236 echo -n "$nb "
pankso@61 237 gettext "packages added in"
pankso@61 238 echo " ${time}s ($(date "+%Y%m%d %H:%M"))"
pankso@61 239 fi
pankso@61 240 newline
pankso@61 241 # Handle --extra: Use local repo as extra mirror with symlinks
pankso@61 242 # to packages lists.
pankso@61 243 if [ "$extra" ]; then
pankso@61 244 boldify $(gettext "Enabling extra local mirror")
pankso@61 245 separator
pankso@61 246 db=$extradb/local
pankso@61 247 debug "database: $db"
pankso@61 248 mkdir -p $db && rm -f $db/*
pankso@61 249 echo "$pkgsdir/" > $db/mirror
pankso@61 250 for list in packages.*
pankso@61 251 do
pankso@61 252 gettext "Linking:"; echo -n " $list"
pankso@61 253 ln -s $pkgsdir/$list $db/$list
pankso@61 254 status
pankso@61 255 done
pankso@61 256 gettext "Copying: ID (uniq identity)"
pankso@61 257 cp $pkgsdir/ID $db && status
pankso@61 258 separator && newline
pankso@61 259 fi ;;
pankso@61 260 --*) continue ;;
pankso@61 261 *)
pankso@61 262 [ "$count" == 0 ] && newline
pankso@61 263 count=$(($count + 1))
pankso@61 264 gettext "Can't handle:"
pankso@61 265 colorize " $url" 31 && newline ;;
pankso@61 266 esac
pankso@61 267 done
pankso@61 268
pankso@61 269 exit 0