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