spk annotate spk-archive @ rev 26
spk-add: make id busybox ash compatible and fix libspk.sh as well
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Tue May 15 18:17:27 2012 +0200 (2012-05-15) |
parents | db99af6fac70 |
children | bb5a37f13ad6 |
rev | line source |
---|---|
pankso@26 | 1 #!/bin/bash |
meshca@11 | 2 # |
meshca@11 | 3 # Spk-Archive - SliTaz Package Archive Manager |
meshca@11 | 4 # |
meshca@11 | 5 # NOT COMPLETE: Still need to re-write (just what was grabbed from tazpkg) |
meshca@11 | 6 # UNSURE: Should Pack and Repack be here? |
meshca@11 | 7 # |
meshca@11 | 8 # Authors : See the AUTHORS files |
meshca@11 | 9 |
meshca@11 | 10 source /usr/lib/slitaz/libspk.sh |
meshca@11 | 11 |
meshca@11 | 12 usage() { |
meshca@11 | 13 name=$(basename $0) |
pankso@26 | 14 cat << EOT |
meshca@11 | 15 |
meshca@11 | 16 $(boldify $(gettext "Usage:")) $name [command] package |
meshca@11 | 17 |
meshca@11 | 18 $(boldify $(gettext "Commands:")) |
meshca@11 | 19 pack |
meshca@11 | 20 repack [--config] |
meshca@11 | 21 extract |
meshca@11 | 22 recompress |
meshca@11 | 23 |
meshca@11 | 24 $(boldify "$(gettext "Example:")") |
meshca@11 | 25 $name extract clex |
meshca@11 | 26 |
meshca@11 | 27 EOT |
meshca@11 | 28 exit 0 |
meshca@11 | 29 } |
meshca@11 | 30 |
meshca@11 | 31 # Extract a package with cpio and gzip/lzma to the current directory. |
meshca@11 | 32 # Parameters: package_file |
meshca@11 | 33 extract_package() { |
meshca@11 | 34 local package_file=$1 |
meshca@11 | 35 local package_name=$(package_name $package_file) |
pankso@26 | 36 |
meshca@11 | 37 eval_gettext "Extracting \$package_name... " |
meshca@11 | 38 cpio -idm --quiet < ${package_file##*/} && rm -f ${package_file##*/} |
meshca@11 | 39 status |
pankso@26 | 40 |
meshca@11 | 41 gettext "Extracting the pseudo fs... " |
meshca@11 | 42 if [ -f fs.cpio.lzma ]; then |
meshca@11 | 43 echo -n "(lzma) " |
meshca@11 | 44 unlzma -c fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma |
meshca@11 | 45 elif [ -f fs.cpio.gz ]; then |
meshca@11 | 46 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz |
meshca@11 | 47 fi |
meshca@11 | 48 status |
meshca@11 | 49 } |
meshca@11 | 50 |
meshca@11 | 51 # Extract .tazpkg cpio archive into a directory. |
meshca@11 | 52 # Parameters: package_file results_directory |
meshca@11 | 53 extract() { |
meshca@11 | 54 local package_file=$1 |
meshca@11 | 55 local target_dir=$2 |
pankso@26 | 56 |
meshca@11 | 57 # validate the file |
meshca@11 | 58 check_valid_tazpkg $package_file |
pankso@26 | 59 |
meshca@11 | 60 # find the package name |
meshca@11 | 61 local package_name=$(package_name $package_file) |
meshca@11 | 62 |
meshca@11 | 63 # Create destination directory |
meshca@11 | 64 local dest_dir=$(pwd)/$package_name |
meshca@11 | 65 [ -n "$target_dir" ] && dest_dir=$target_dir/$package_name |
meshca@11 | 66 mkdir -p $dest_dir |
pankso@26 | 67 |
meshca@11 | 68 newline |
meshca@11 | 69 echo $(boldify $(gettext "Extracting:")) $package_name |
meshca@11 | 70 separator |
pankso@26 | 71 |
meshca@11 | 72 gettext "Copying original package..." |
meshca@11 | 73 cp $package_file $dest_dir |
meshca@11 | 74 status |
meshca@11 | 75 pushd $dest_dir > /dev/null |
meshca@11 | 76 extract_package $package $package_file |
meshca@11 | 77 popd > /dev/null |
meshca@11 | 78 separator |
meshca@11 | 79 eval_gettext "\$package_name is extracted to: \$dest_dir"; newline |
meshca@11 | 80 newline |
meshca@11 | 81 } |
meshca@11 | 82 |
meshca@11 | 83 # Recompress .tazpkg cpio archive with lzma. |
meshca@11 | 84 # Parameters: package_file |
meshca@11 | 85 recompress() { |
pankso@26 | 86 local package_file=$1 |
meshca@11 | 87 valid_tazpkg $package_file |
pankso@26 | 88 |
meshca@11 | 89 local package_name=$(package_name $package_file) |
pankso@26 | 90 |
meshca@11 | 91 newline |
meshca@11 | 92 echo $(boldify $(gettext "Recompressing:")) $package_name |
meshca@11 | 93 separator |
pankso@26 | 94 |
meshca@11 | 95 mkdir -p $TMP_DIR |
pankso@26 | 96 |
meshca@11 | 97 gettext "Copying original package..." |
meshca@11 | 98 cp $package_file $TMP_DIR |
meshca@11 | 99 status |
pankso@26 | 100 |
meshca@11 | 101 pushd $TMP_DIR > /dev/null |
meshca@11 | 102 extract_package $package_file |
pankso@26 | 103 |
meshca@11 | 104 gettext "Recompressing the fs... " |
meshca@11 | 105 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si |
meshca@11 | 106 rm -rf fs |
meshca@11 | 107 status |
meshca@11 | 108 popd > /dev/null |
pankso@26 | 109 |
meshca@11 | 110 gettext "Creating new package... " |
meshca@11 | 111 find $TMP_DIR -print | cpio -o -H newc --quiet > \ |
meshca@11 | 112 $(basename $package_file).$$ && mv -f \ |
meshca@11 | 113 $(basename $package_file).$$ \ |
meshca@11 | 114 $(basename $package_file) |
meshca@11 | 115 status |
pankso@26 | 116 |
meshca@11 | 117 rm -rf $TMP_DIR |
meshca@11 | 118 } |
meshca@11 | 119 |
meshca@11 | 120 # Create SliTaz package archive from an installed package. |
meshca@11 | 121 # Parameters: package |
meshca@11 | 122 repack() { |
meshca@11 | 123 local package=$1 |
meshca@11 | 124 unset EXTRAVERSION |
meshca@11 | 125 source $INSTALLED/$package/receipt |
meshca@11 | 126 newline |
meshca@11 | 127 echo -e "$(bold Repacking :) $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" |
meshca@11 | 128 separator |
meshca@11 | 129 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then |
meshca@11 | 130 eval_gettext "Can't repack \$PACKAGE"; newline |
meshca@11 | 131 exit 1 |
meshca@11 | 132 fi |
meshca@11 | 133 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then |
meshca@11 | 134 eval_gettext "Can't repack, \$PACKAGE files have been modified by:"; newline |
meshca@11 | 135 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do |
meshca@11 | 136 echo " $i" |
meshca@11 | 137 done |
meshca@11 | 138 exit 1 |
meshca@11 | 139 fi |
meshca@11 | 140 unset MISSING |
meshca@11 | 141 while read i; do |
meshca@11 | 142 [ -e "$i" ] && continue |
meshca@11 | 143 [ -L "$i" ] || MISSING="$MISSING\n $i" |
meshca@11 | 144 done < $INSTALLED/$PACKAGE/files.list |
meshca@11 | 145 if [ -n "$MISSING" ]; then |
meshca@11 | 146 gettext "Can't repack, the following files are lost:" |
meshca@11 | 147 echo -e "$MISSING" |
meshca@11 | 148 exit 1 |
meshca@11 | 149 fi |
pankso@26 | 150 mkdir -p $TMP_DIR |
meshca@11 | 151 pushd $TMP_DIR > /dev/null |
meshca@11 | 152 FILES="fs.cpio.lzma\n" |
meshca@11 | 153 for i in $(ls $INSTALLED/$PACKAGE) ; do |
meshca@11 | 154 [ "$i" = "volatile.cpio.gz" ] && continue |
meshca@11 | 155 [ "$i" = "modifiers" ] && continue |
meshca@11 | 156 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n" |
meshca@11 | 157 done |
meshca@11 | 158 ln -s / rootfs |
meshca@11 | 159 mkdir tmp |
meshca@11 | 160 sed 's/^/rootfs/' < files.list | cpio -o -H newc --quiet |\ |
meshca@11 | 161 { cd tmp ; cpio -idm --quiet >/dev/null; cd ..; } |
meshca@11 | 162 mv tmp/rootfs fs |
meshca@11 | 163 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then |
meshca@11 | 164 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \ |
meshca@11 | 165 { cd fs; cpio -idm --quiet; cd ..; } |
meshca@11 | 166 fi |
meshca@11 | 167 if fgrep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then |
meshca@11 | 168 . $INSTALLED/$PACKAGE/receipt |
meshca@11 | 169 repack_cleanup fs |
meshca@11 | 170 fi |
meshca@11 | 171 if [ -f $INSTALLED/$PACKAGE/$CHECKSUM ]; then |
meshca@11 | 172 sed 's, , fs,' < $INSTALLED/$PACKAGE/$CHECKSUM | \ |
meshca@11 | 173 $CHECKSUM -s -c || { |
meshca@11 | 174 gettext "Can't repack, $CHECKSUM error."; newline |
meshca@11 | 175 popd |
meshca@11 | 176 rm -rf $TMP_DIR |
meshca@11 | 177 exit 1 |
meshca@11 | 178 } |
meshca@11 | 179 fi |
meshca@11 | 180 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si |
meshca@11 | 181 echo -e "$FILES" | cpio -o -H newc --quiet > $PACKAGE-$VERSION$EXTRAVERSION.tazpkg |
meshca@11 | 182 popd > /dev/null |
meshca@11 | 183 mv $TMP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg . |
meshca@11 | 184 rm -R $TMP_DIR |
meshca@11 | 185 eval_gettext "Package \$PACKAGE repacked successfully."; newline |
meshca@11 | 186 echo $(gettext "Size") : $(du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg) |
meshca@11 | 187 newline |
meshca@11 | 188 } |
meshca@11 | 189 |
meshca@11 | 190 # Create SliTaz package archive from configuration files. |
meshca@11 | 191 repack_config() { |
meshca@11 | 192 mkdir -p $TMP_DIR |
meshca@11 | 193 pushd $TMP_DIR > /dev/null |
meshca@11 | 194 CONFIG_VERSION=1.0 |
meshca@11 | 195 mkdir config-$CONFIG_VERSION |
meshca@11 | 196 pushd config-$CONFIG_VERSION |
meshca@11 | 197 for i in $INSTALLED/*/volatile.cpio.gz; do |
meshca@11 | 198 zcat $i | cpio -t --quiet |
meshca@11 | 199 done > files.list |
meshca@11 | 200 mkdir fs |
meshca@11 | 201 pushd fs |
meshca@11 | 202 ( cd / ; cpio -o -H newc --quiet ) < ../files.list | cpio -idm --quiet > /dev/null |
meshca@11 | 203 mkdir -p etc/tazlito |
meshca@11 | 204 for i in $INSTALLED/*/receipt; do |
meshca@11 | 205 unset EXTRAVERSION |
meshca@11 | 206 source $i |
meshca@11 | 207 echo "$PACKAGE-$VERSION$EXTRAVERSION" |
meshca@11 | 208 done > etc/tazlito/config-packages.list |
meshca@11 | 209 popd > /dev/null |
meshca@11 | 210 echo "etc/tazlito/config-packages.list" >> files.list |
meshca@11 | 211 cat > receipt <<EOT |
meshca@11 | 212 # SliTaz package receipt. |
meshca@11 | 213 |
meshca@11 | 214 PACKAGE="config" |
meshca@11 | 215 VERSION="$CONFIG_VERSION" |
meshca@11 | 216 CATEGORY="base-system" |
meshca@11 | 217 SHORT_DESC="$(gettext "User configuration backup on ")$(date)" |
meshca@11 | 218 DEPENDS="$(ls $INSTALLED)" |
meshca@11 | 219 EOT |
meshca@11 | 220 popd |
meshca@11 | 221 tazpkg pack config-$CONFIG_VERSION |
meshca@11 | 222 popd |
meshca@11 | 223 cp $TMP_DIR/config-$CONFIG_VERSION.tazpkg . |
meshca@11 | 224 rm -rf $TMP_DIR |
meshca@11 | 225 } |
meshca@11 | 226 |
meshca@11 | 227 # Create SliTaz package archive using cpio and gzip. |
meshca@11 | 228 # Parameters: package |
meshca@11 | 229 pack() { |
meshca@11 | 230 local package="$1" |
meshca@11 | 231 cd $PACKAGE |
meshca@11 | 232 if [ ! -f "receipt" ]; then |
meshca@11 | 233 gettext "Receipt is missing. Please read the documentation."; newline |
meshca@11 | 234 exit 0 |
meshca@11 | 235 else |
meshca@11 | 236 newline |
meshca@11 | 237 echo "$(bold Packing :) $PACKAGE" |
meshca@11 | 238 separator |
meshca@11 | 239 # Create files.list with redirecting find outpout. |
pankso@26 | 240 gettext "Creating the list of files..." |
meshca@11 | 241 pushd fs |
meshca@11 | 242 find . -type f -print > ../files.list |
meshca@11 | 243 find . -type l -print >> ../files.list |
meshca@11 | 244 popd |
meshca@11 | 245 sed -i s/'^.'/''/ files.list |
meshca@11 | 246 status |
meshca@11 | 247 gettext "Creating $CHECKSUM of files..." |
meshca@11 | 248 while read file; do |
meshca@11 | 249 [ -L "fs$file" ] && continue |
meshca@11 | 250 [ -f "fs$file" ] || continue |
meshca@11 | 251 case "$file" in |
meshca@11 | 252 /lib/modules/*/modules.*|*.pyc) continue;; |
meshca@11 | 253 esac |
meshca@11 | 254 $CHECKSUM "fs$file" | sed 's/ fs/ /' |
meshca@11 | 255 done < files.list > $CHECKSUM |
meshca@11 | 256 status |
meshca@11 | 257 UNPACKED_SIZE=$(du -chs fs receipt files.list $CHECKSUM \ |
meshca@11 | 258 description.txt 2> /dev/null | awk \ |
meshca@11 | 259 '{ sz=$1 } END { print sz }') |
meshca@11 | 260 # Build cpio archives. |
meshca@11 | 261 gettext "Compressing the fs... " |
meshca@11 | 262 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si |
meshca@11 | 263 rm -rf fs |
meshca@11 | 264 status |
meshca@11 | 265 PACKED_SIZE=$(du -chs fs.cpio.lzma receipt files.list \ |
meshca@11 | 266 $CHECKSUM description.txt 2> /dev/null | awk \ |
meshca@11 | 267 '{ sz=$1 } END { print sz }') |
meshca@11 | 268 gettext "Updating receipt sizes..." |
meshca@11 | 269 sed -i s/^PACKED_SIZE.*$// receipt |
meshca@11 | 270 sed -i s/^UNPACKED_SIZE.*$// receipt |
meshca@11 | 271 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt |
meshca@11 | 272 status |
meshca@11 | 273 gettext "Creating full cpio archive... " |
meshca@11 | 274 find . -print | cpio -o -H newc --quiet > ../$PACKAGE.tazpkg |
meshca@11 | 275 status |
meshca@11 | 276 gettext "Restoring original package tree... " |
meshca@11 | 277 unlzma -c fs.cpio.lzma | cpio -idm --quiet |
meshca@11 | 278 status |
meshca@11 | 279 rm fs.cpio.lzma && cd .. |
meshca@11 | 280 separator |
meshca@11 | 281 eval_gettext "Package \$PACKAGE compressed successfully."; newline |
meshca@11 | 282 echo $(gettext "Size") : $(du -sh $PACKAGE.tazpkg) |
meshca@11 | 283 newline |
meshca@11 | 284 fi |
meshca@11 | 285 } |
meshca@11 | 286 |
meshca@11 | 287 case $1 in |
meshca@11 | 288 pack|-p) |
meshca@11 | 289 pack $2 ;; |
meshca@11 | 290 extract|-e) |
meshca@11 | 291 extract_package $2 $3 ;; |
meshca@11 | 292 recompress|-r) |
meshca@11 | 293 recompress $2 ;; |
meshca@11 | 294 *) |
meshca@11 | 295 usage ;; |
meshca@11 | 296 esac |