spk 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 | 17ac07667767 |
children | 36c7fb7707d0 |
files | spk-mirror |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/spk-mirror Thu May 17 23:41:42 2012 +0200 1.3 @@ -0,0 +1,269 @@ 1.4 +#!/bin/sh 1.5 +# 1.6 +# Spk-mirror - Handle SliTaz packages mirrors. Read the README before 1.7 +# adding or modifing any code in spk! 1.8 +# 1.9 +# Copyright (C) SliTaz GNU/Linux - BSD License 1.10 +# Author: See AUTHORS files 1.11 +# 1.12 +. /usr/lib/slitaz/libspk.sh 1.13 + 1.14 +# NOTE: I want to use 'extra' mirrors since we can add any extra mirror 1.15 +# URL's and not only undigest. See also undigest command - Pankso 1.16 + 1.17 +# 1.18 +# Functions 1.19 +# 1.20 + 1.21 +# Help and usage 1.22 +usage() { 1.23 + name=$(basename $0) 1.24 + cat << EOT 1.25 + 1.26 +$(boldify $(gettext "Usage:")) $name [urls|info|--options] 1.27 + 1.28 +$(gettext "Handle SliTaz packages mirrors") 1.29 + 1.30 +$(boldify $(gettext "Options:")) 1.31 + --list 1.32 + --rm 1.33 + --nodb 1.34 + --extra 1.35 + --debug 1.36 + 1.37 +$(boldify $(gettext "Examples:")) 1.38 + $name http://mirror.slitaz.org/ 1.39 + $name /path/to/packages --nodb --extra 1.40 + 1.41 +EOT 1.42 + exit 0 1.43 +} 1.44 + 1.45 +# Check if we have packages ID and lists on mirror. 1.46 +check_mirror() { 1.47 + for file in packages.list packages.$SUM packages.desc ID 1.48 + do 1.49 + gettext "Checking file:"; echo -n " $file" 1.50 + if ! wget -q -s -T 6 ${1}${list} 2>/dev/null; then 1.51 + newline 1.52 + gettext "Unable to reach:"; colorize " $file" 31 1.53 + newline && return 1 1.54 + fi 1.55 + status 1.56 + done 1.57 +} 1.58 + 1.59 +# Get extra mirror DB path 1.60 +extra_db() { 1.61 + db=$(echo ${url#*://} | cut -d "/" -f1 ) 1.62 + debug "extra mirror: $url" 1.63 + debug "extra DB: $db" 1.64 +} 1.65 + 1.66 +# Add a package to lists 1.67 +addto_list() { 1.68 + cd $pkgsdir 1.69 + echo "$PACKAGE-${VERSION}${EXTRAVERSION}" >> packages.list 1.70 + $CHECKSUM $(basename $pkg) >> packages.$SUM 1.71 + # 1.72 + # Add PACKED_SIZE UNPACKED_SIZE to be used to know packages size 1.73 + # before installing ??? --> actually done via packages.txt 1.74 + # 1.75 + cat >> packages.desc << EOT 1.76 +$PACKAGE | ${VERSION}${EXTRAVERSION} | $SHORT_DESC | $CATEGORY | $WEBSITE" 1.77 +EOT 1.78 + # packages.equiv is used by tazpkg install to check depends. 1.79 + touch packages.equiv 1.80 + for i in $PROVIDE; do 1.81 + dest="" 1.82 + echo $i | fgrep -q : && dest="${i#*:}:" 1.83 + if grep -qs ^${i%:*}= packages.equiv; then 1.84 + sed -i "s/^${i%:*}=/${i%:*}=${dest}$PACKAGE /" packages.equiv 1.85 + else 1.86 + echo "${i%:*}=${dest}$PACKAGE" >> packages.equiv 1.87 + fi 1.88 + done 1.89 + # files.list provides a list of all packages files. 1.90 + cat $tmpdir/files.list | sed s/^/"$PACKAGE: \0"/ >> $pkgsdir/files.list 1.91 +} 1.92 + 1.93 +# 1.94 +# Commands 1.95 +# 1.96 + 1.97 +cmd=$1 1.98 +[ -d "$cmd" ] && cmd=continue 1.99 + 1.100 +case "$cmd" in 1.101 + *usage|*help) usage ;; 1.102 + http://*|ftp://|'continue') continue ;; 1.103 + undigest) 1.104 + echo "TODO: enable official undigest repo" ;; 1.105 + ""|--list) 1.106 + extra=0 1.107 + excolor=32 1.108 + newline 1.109 + boldify "Mirror info" 1.110 + separator 1.111 + gettext "Main URL :" 1.112 + boldify " $(cat $mirrorurl)" 1.113 + if [ -f "$mirrors" ]; then 1.114 + nb=$(cat $mirrors | wc -l) 1.115 + gettext "Mirrors :"; colorize " $nb " $excolor 1.116 + fi 1.117 + if [ -d "$extradb" ]; then 1.118 + extra=$(ls $extradb | wc -l) 1.119 + fi 1.120 + [ "$extra" != 0 ] || excolor=31 1.121 + gettext "Extra :"; colorize " $extra" $excolor 1.122 + separator 1.123 + newline 1.124 + if [ "$list" ]; then 1.125 + boldify $(gettext "Official mirrors") 1.126 + separator 1.127 + cat $mirrors 1.128 + separator && newline 1.129 + if [ "$extra" != "0" ]; then 1.130 + boldify $(gettext "Extra mirrors") 1.131 + separator 1.132 + cat $extradb/*/mirror 1.133 + separator && newline 1.134 + fi 1.135 + fi 1.136 + exit 0 ;; 1.137 +esac 1.138 + 1.139 +# 1.140 +# Handle all urls 1.141 +# 1.142 + 1.143 +count=0 1.144 + 1.145 +for url in $@ 1.146 +do 1.147 + [ -d "$url" ] && url="dir:$url" 1.148 + case "$url" in 1.149 + http://*|ftp://) 1.150 + [ "$count" == 0 ] && newline 1.151 + count=$(($count + 1)) 1.152 + url="${url%/}/" 1.153 + debug "checking: $url" 1.154 + # Remove extra on --rm 1.155 + if [ "$rm" ]; then 1.156 + extra_db 1.157 + if [ -d "$extradb/$db" ]; then 1.158 + gettext "Removing extra mirror:" 1.159 + echo -n " $(boldify "$db")" 1.160 + rm -rf $extradb/$db && status 1.161 + else 1.162 + gettext "Not an extra mirror:"; colorize " $db" 31 1.163 + fi 1.164 + newline && continue 1.165 + fi 1.166 + # Official mirror 1.167 + if fgrep -q "$url" $mirrors; then 1.168 + gettext "Enabling: official mirror"; newline 1.169 + gettext "Architecture:"; echo " $SLITAZ_ARCH" 1.170 + # Handle arch type 1.171 + case "$SLITAZ_ARCH" in 1.172 + arm|x86_64) arch="$SLITAZ_ARCH/" ;; 1.173 + i486) arch="/" ;; 1.174 + esac 1.175 + url=${url}packages/${SLITAZ_RELEASE}${arch} 1.176 + echo "URL: $(boldify "$url")" 1.177 + echo "$url" > $mirrorurl 1.178 + newline && continue 1.179 + fi 1.180 + # Extra mirror 1.181 + extra_db 1.182 + if [ -d "$extradb/$db" ]; then 1.183 + gettext "Extra mirror already exist"; newline 1.184 + echo -n "DB:"; boldify " $db" 1.185 + else 1.186 + gettext "Enabling: extra mirror"; newline 1.187 + echo "URL: $(boldify "$url")" 1.188 + if ! check_mirror $url; then 1.189 + continue 1.190 + fi 1.191 + mkdir -p $extradb/$db 1.192 + echo "$url" > $extradb/$db/mirror 1.193 + gettext "New extra mirror is ready to use"; newline 1.194 + fi 1.195 + newline ;; 1.196 + dir:*) 1.197 + # Handle local mirror 1.198 + dir=${url#dir:} 1.199 + pkgsdir=${dir%/} 1.200 + debug "dir: $dir" 1.201 + nb=$(ls $pkgsdir/*.tazpkg 2>/dev/null | wc -l) 1.202 + if [ "$nb" == 0 ]; then 1.203 + gettext "No packages found in:"; boldify " $pkgsdir" 1.204 + continue 1.205 + fi 1.206 + newline 1.207 + gettext "Directory:"; boldify " $pkgsdir" 1.208 + gettext "Packages :"; colorize " $nb" 32 1.209 + cd $pkgsdir 1.210 + if [ ! "$nodb" ]; then 1.211 + time=$(date +%s) 1.212 + rm -f packages.* ID 1.213 + newline 1.214 + boldify $(gettext "Creating packages lists") 1.215 + separator 1.216 + for pkg in $pkgsdir/*.tazpkg 1.217 + do 1.218 + gettext "Extracting data:"; echo -n " $(basename $pkg)" 1.219 + mkdir -p $tmpdir 1.220 + extract_receipt $tmpdir $pkg 1.221 + extract_fileslist $tmpdir $pkg 1.222 + source $tmpdir/receipt 1.223 + addto_list && status 1.224 + unset_receipt 1.225 + rm -rf $tmpdir 1.226 + done 1.227 + # files.list.lzma 1.228 + gettext "Compressing the files.list..." 1.229 + lzma e files.list files.list.lzma 1.230 + rm -f files.list 1.231 + status 1.232 + # ID 1.233 + gettext "Creating uniq identity ID..." 1.234 + $CHECKSUM packages.$SUM | cut -d ' ' -f 1 > ID 1.235 + status 1.236 + # Summary 1.237 + separator 1.238 + time=$(($(date +%s) - $time)) 1.239 + echo -n "$nb " 1.240 + gettext "packages added in" 1.241 + echo " ${time}s ($(date "+%Y%m%d %H:%M"))" 1.242 + fi 1.243 + newline 1.244 + # Handle --extra: Use local repo as extra mirror with symlinks 1.245 + # to packages lists. 1.246 + if [ "$extra" ]; then 1.247 + boldify $(gettext "Enabling extra local mirror") 1.248 + separator 1.249 + db=$extradb/local 1.250 + debug "database: $db" 1.251 + mkdir -p $db && rm -f $db/* 1.252 + echo "$pkgsdir/" > $db/mirror 1.253 + for list in packages.* 1.254 + do 1.255 + gettext "Linking:"; echo -n " $list" 1.256 + ln -s $pkgsdir/$list $db/$list 1.257 + status 1.258 + done 1.259 + gettext "Copying: ID (uniq identity)" 1.260 + cp $pkgsdir/ID $db && status 1.261 + separator && newline 1.262 + fi ;; 1.263 + --*) continue ;; 1.264 + *) 1.265 + [ "$count" == 0 ] && newline 1.266 + count=$(($count + 1)) 1.267 + gettext "Can't handle:" 1.268 + colorize " $url" 31 && newline ;; 1.269 + esac 1.270 +done 1.271 + 1.272 +exit 0