spk rev 110
Add spk-convert (Still needs a few functions)
author | Christian Mesh <meshca@clarkson.edu> |
---|---|
date | Sat Jun 09 09:34:42 2012 -0500 (2012-06-09) |
parents | b767df7ddb20 |
children | dae62126a6a4 |
files | spk-convert |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/spk-convert Sat Jun 09 09:34:42 2012 -0500 1.3 @@ -0,0 +1,406 @@ 1.4 +#!/bin/sh 1.5 +# 1.6 +# Spk-convert - Convert other distrobution's packages to tazpkg form. Read the README before adding or 1.7 +# 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 +# 1.15 +# Functions 1.16 +# 1.17 + 1.18 +# Help and usage 1.19 +usage() { 1.20 + name=$(basename $0) 1.21 + cat << EOT 1.22 + 1.23 +$(boldify $(gettext "Usage:")) $name [packages|--options] 1.24 + 1.25 +$(gettext "Convert SliTaz Packages") 1.26 + 1.27 +$(boldify $(gettext "Options:")) 1.28 + --install $(gettext "Install package after conversion") 1.29 + --root= $(gettext "Set the root file system path") 1.30 + --debug $(gettext "Display some useful debug information") 1.31 + 1.32 +$(boldify $(gettext "Examples:")) 1.33 + $name package1.rpm package2.tgz packageN.ipk 1.34 + 1.35 +EOT 1.36 + exit 0 1.37 +} 1.38 + 1.39 +# TODO find_depends show_unresolved_lib 1.40 +# Move tazpkg pack to shared lib? 1.41 + 1.42 +# generate a receipt based on standard receipt vars 1.43 +# Usage: generate_receipt $receipt $base_package 1.44 +generate_receipt() { 1.45 + local receipt=$1 1.46 + local base_package=$2 1.47 + cat > $receipt <<EOT 1.48 +# SliTaz package receipt. 1.49 +# generated by tazpkg from package $(basename $base_package) 1.50 +PACKAGE="$PACKAGE" 1.51 +VERSION="$VERSION" 1.52 +CATEGORY="misc" 1.53 +SHORT_DESC="$SHORT_DESC" 1.54 +WEB_SITE="$WEB_SITE" 1.55 +MAINTAINER="$MAINTAINER" 1.56 +DEPENDS="$(find_depends)" 1.57 +CONFIG_FILES="$CONFIG_FILES" 1.58 +EOT 1.59 + 1.60 +} 1.61 + 1.62 +# convert a .ipk package to .tazpkg 1.63 +# Usage: convert_ipk $package_file 1.64 +convert_ipk() { 1.65 + local package_file=$1 1.66 + 1.67 + mkdir -p $tmp 1.68 + tar xOzf $package_file ./control.tar.gz | tar xzf - -C $tmp 1.69 + 1.70 + local control="$tmp/control" 1.71 + 1.72 + # filter ipk control file for variable 1.73 + # Usage: filter_vars $search_var 1.74 + filter_vars() { 1.75 + local var=$1 1.76 + echo "$(grep ^$var $control | sed 's/.*: //')" 1.77 + } 1.78 + 1.79 + # Load up receipt template variables 1.80 + PACKAGE=$(filter_vars "Package") 1.81 + VERSION=$(filter_vars "Version") 1.82 + MAINTAINER=$(filter_vars "Maintainer") 1.83 + SHORT_DESC=$(filter_vars "Description") 1.84 + WEB_SITE="http://openwrt.org/" 1.85 + 1.86 + target=$(filter_vars "Architecture") 1.87 + case "$target" in 1.88 + i386|all) 1.89 + local file="$PACKAGE-$VERSION" 1.90 + local receipt="$tmp/$file/receipt" 1.91 + local fs="$tmp/$file/fs" 1.92 + 1.93 + mkdir -p $fs 1.94 + tar xOzf $package_file ./data.tar.gz | tar xzf - -C $fs 1.95 + 1.96 + unset CONFIG_FILES 1.97 + [ -s $tmp/conffiles ] && $CONFIG_FILE=$(cat $tmp/conffiles) 1.98 + 1.99 + generate_receipt $receipt $package_file 1.100 + 1.101 + show_unresolved_lib $receipt 1.102 + 1.103 + # Writes a ipk script to receipt function 1.104 + # Usage: transpose_func $function_name $script 1.105 + transpose_func() { 1.106 + local func=$1 1.107 + local script=$2 1.108 + if [ -s $script ]; then 1.109 + cat >> $receipt << EOT 1.110 +$func() 1.111 +{ 1.112 +$(cat $script) 1.113 +} 1.114 +EOT 1.115 + } 1.116 + 1.117 + # read functions into receipt 1.118 + transpose_func pre_install $tmp/preinst 1.119 + transpose_func post_install $tmp/postinst 1.120 + transpose_func pre_remove $tmp/prerm 1.121 + transpose_func post_remove $tmp/postrm 1.122 + 1.123 + [ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt 1.124 + 1.125 + cd $tmp 1.126 + tazpkg pack $file 1.127 + cd - > /dev/null 1.128 + 1.129 + mv $tmp/$file.tazpkg . 1.130 + ;; 1.131 + *) 1.132 + gettext "Invalid target: $target (expected i386)"; newline 1.133 + ;; 1.134 + esac 1.135 + unset_receipt 1.136 + rm -rf $tmp 1.137 +} 1.138 + 1.139 +# convert a .pkg.tar.gz/.apk package to .tazpkg 1.140 +# Usage: convert_arch $package_file 1.141 +convert_arch() { 1.142 + local package_file=$1 1.143 + 1.144 + # Extract 1.145 + local fs="$tmp/fs" 1.146 + mkdir -p $fs 1.147 + tar xzf $package_file -C $fs 1.148 + 1.149 + local PKGINFO="$fs/.PKGINFO" 1.150 + if [ -f $PKGINFO ]; then 1.151 + 1.152 + # filter .PKGINFO file for variable 1.153 + # Usage: filter_vars $search_var 1.154 + filter_vars() { 1.155 + local var=$1 1.156 + echo $(grep ^$var $PKGINFO | sed 's/.*= //') 1.157 + } 1.158 + 1.159 + PACKAGE=$(filter_vars "pkgname") 1.160 + VERSION=$(filter_vars "pkgver") 1.161 + SHORT_DESC=$(filter_vars "pkgdesc") 1.162 + WEB_SITE=$(filter_vars "url") 1.163 + MAINTAINER=$(filter_vars "packager") 1.164 + 1.165 + local file="$tmp/$package-$version" 1.166 + local receipt="$file/receipt" 1.167 + 1.168 + generate_receipt $receipt $package_file 1.169 + 1.170 + mkdir $file 1.171 + mv $fs $file 1.172 + 1.173 + show_unresolved_lib $tmp/$file/receipt 1.174 + rm -f $file/fs/.[A-Z]* 1.175 + 1.176 + cd $tmp 1.177 + tazpkg pack $file 1.178 + cd - > /dev/null 1.179 + 1.180 + mv $file.tazpkg . 1.181 + else 1.182 + eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline 1.183 + fi 1.184 + unset_receipt 1.185 + rm -rf $tmp 1.186 +} 1.187 + 1.188 +# convert a .tgz package to .tazpkg 1.189 +# Usage: convert_tgz $package_file 1.190 +convert_tgz() { 1.191 + local package_file=$1 1.192 + local package=$(basename $package_file) 1.193 + 1.194 + # Set package to current args 1.195 + IFS='-' 1.196 + set -- $package 1.197 + unset IFS 1.198 + 1.199 + local PACKAGE=$1 1.200 + local VERSION=$2 1.201 + local file="$tmp/$PACKAGE-$VERSION" 1.202 + local receipt="$file/receipt" 1.203 + local fs="$file/fs" 1.204 + 1.205 + # Extract package 1.206 + mkdir -p $fs 1.207 + tar xzf $package_file -C $fs 1.208 + 1.209 + if [ -d $fs/install ]; then 1.210 + # Set other receipt vars 1.211 + SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \ 1.212 + head -1 | sed 's/.*(\(.*\)).*/\1/') 1.213 + WEB_SITE="http://www.slackware.com/packages/" 1.214 + MAINTAINER="nobody@slitaz.org" 1.215 + 1.216 + generate_receipt $receipt $package_file 1.217 + 1.218 + show_unresolved_lib $receipt 1.219 + 1.220 + # post_install function from doinst.sh 1.221 + if [ -f $fs/install/doinst.sh ]; then 1.222 + cat >> $receipt <<EOM 1.223 + 1.224 +post_install() 1.225 +{ 1.226 +chroot \$1/ sh - << EOT 1.227 +cd / 1.228 +$(cat $fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g') 1.229 +EOT 1.230 +} 1.231 +EOM 1.232 + # Get full description 1.233 + if [ ! -z "$SHORT_DESC" ]; then 1.234 + grep ^$PACKAGE $fs/install/slack-desc | \ 1.235 + sed "s/^$PACKAGE://" > $file/description.txt 1.236 + fi 1.237 + 1.238 + rm -rf $fs/install 1.239 + 1.240 + cd $tmp 1.241 + tazpkg pack $file 1.242 + cd - /dev/null 1.243 + 1.244 + mv $file.tazpkg . 1.245 + else 1.246 + eval_gettext "\$package_file does not look like a Slackware package !"; newline 1.247 + fi 1.248 + rm -rf $tmp 1.249 +} 1.250 + 1.251 +# convert a .deb package to .tazpkg 1.252 +# Usage: convert_deb $package_file 1.253 +convert_deb() { 1.254 + local $package_file=$1 1.255 + 1.256 + # Extract deb control 1.257 + mkdir -p $tmp 1.258 + dpkg-deb -e $package_file $tmp 1.259 + 1.260 + 1.261 + # filter control file for variable 1.262 + # Usage: filter_vars $search_var 1.263 + filter_vars() { 1.264 + local var=$1 1.265 + local result=$(grep '^ *$var:' $tmp/control) 1.266 + echo ${result##*:} 1.267 + } 1.268 + 1.269 + PACKAGE=$(filter_vars "Package") 1.270 + VERSION=$(filter_vars "Version") 1.271 + SHORT_DESC=$(filter_vars "Description") 1.272 + WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE" 1.273 + MAINTAINER="nobody@slitaz.org" 1.274 + target="$(grep ^Architecture $tmp/control | sed 's/.*: //')" 1.275 + 1.276 + case "$target" in 1.277 + i386|all) 1.278 + local file="$tmp/$PACKAGE-$VERSION" 1.279 + local receipt="$file/receipt" 1.280 + local fs="$file/fs" 1.281 + 1.282 + # Extract deb contents 1.283 + mkdir -p $fs 1.284 + dpkg-deb -x $package_file $fs 1.285 + 1.286 + generate_receipt $receipt $package_file 1.287 + 1.288 + cd $TMP_DIR 1.289 + 1.290 + if [ -s $tmp/conffiles ]; then 1.291 + cat >> $receipt <<EOT 1.292 +CONFIG_FILES="$(cat $tmp/conffiles)" 1.293 +EOT 1.294 + fi 1.295 + 1.296 + show_unresolved_lib $file/receipt 1.297 + 1.298 + # Description.txt 1.299 + [ -z "$SHORT_DESC" ] || echo "$SHORT_DESC" > $file/Description.txt 1.300 + 1.301 + cd $tmp 1.302 + tazpkg pack $file 1.303 + cd - > /dev/null 1.304 + 1.305 + mv $file.tazpkg . 1.306 + ;; 1.307 + *) 1.308 + gettext "Invalid target: $target (expected i386 or all)"; newline 1.309 + ;; 1.310 + esac 1.311 + rm -rf $tmp 1.312 +} 1.313 + 1.314 +# convert a .rpm package to .tazpkg 1.315 +# Usage: convert_rpm $package_file 1.316 +convert_rpm() { 1.317 + local package_file=$1 1.318 + 1.319 + # Move package_file to tmp 1.320 + mkdir -p $tmp 1.321 + cp $package_file $tmp 1.322 + package_file=$TMP_DIR/$(basename $package_file) 1.323 + 1.324 + # filter package_file for variable 1.325 + # Usage: filter_vars $search_var 1.326 + filter_vars() { 1.327 + local var=$1 1.328 + echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}') 1.329 + } 1.330 + 1.331 + PACKAGE=$(filter_vars "Name") 1.332 + VERSION=$(filter_vars "Version") 1.333 + SHORT_DESC=$(filter_vars "Summary") 1.334 + WEB_SITE=$(filter_vars "URL") 1.335 + if [ -z "$URL" ]; then 1.336 + WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE" 1.337 + fi 1.338 + CATEGORY="misc"; 1.339 + MAINTAINER="nobody@slitaz.org"; 1.340 + 1.341 + 1.342 + local file="$tmp/$PACKAGE-$VERSION" 1.343 + local receipt="$file/receipt" 1.344 + local fs="$file/fs" 1.345 + 1.346 + mkdir -p $fs 1.347 + 1.348 + generate_receipt $receipt $package_file 1.349 + 1.350 + rpm -qip $PACKAGE_FILE | \ 1.351 + grep "^Description*" -A 100 | \ 1.352 + grep -v "^Description*" > \ 1.353 + $file/description.txt 1.354 + 1.355 + cd $fs 1.356 + rpm2cpio $PACKAGE_FILE | cpio -idm --quiet 1.357 + cd - > /dev/null 1.358 + 1.359 + show_unresolved_lib $receipt 1.360 + 1.361 + cd $tmp 1.362 + tazpkg pack $file 1.363 + cd - 1.364 + 1.365 + mv $file.tazpkg . 1.366 + 1.367 + unset_receipt 1.368 + rm -rf $TMP_DIR 1.369 +} 1.370 + 1.371 + 1.372 +# 1.373 +# Commands and exit 1.374 +# 1.375 + 1.376 +case "$1" in 1.377 + ""|*usage|*help) usage ;; 1.378 +esac 1.379 + 1.380 +# 1.381 +# Handle packages: package package.tazpkg ... packageN packageN.tazpkg 1.382 +# 1.383 + 1.384 +check_root 1.385 + 1.386 +for pkg in $@ 1.387 +do 1.388 + if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ]; 1.389 + then 1.390 + convert_deb $pkg 1.391 + else 1.392 + case "$pkg" in 1.393 + *.deb|*.udeb) 1.394 + convert_deb $pkg;; 1.395 + *.rpm) 1.396 + convert_rpm $pkg;; 1.397 + *.tgz) 1.398 + convert_tgz $pkg;; 1.399 + *.apk|*.pkg.tar.gz) 1.400 + convert_arch $pkg;; 1.401 + *.ipk|*.opk) 1.402 + convert_ipk $pkg;; 1.403 + *) 1.404 + gettext "Unsupported format"; newline;; 1.405 + esac 1.406 + fi 1.407 +done 1.408 + 1.409 +exit 0