#!/bin/bash ARCHIVE_INDEX="index.catpak.lst" ARCHIVE_CONTENT="index.catpak" function create_packageset { truncate -s 0 ./$ARCHIVE_INDEX truncate -s 0 ./$ARCHIVE_CONTENT find -type f ! -iname "$ARCHIVE_INDEX" ! -iname "$ARCHIVE_CONTENT" -exec sh -c 'stat -c "%s^%n^%a" "$1" >> "./$2"; cat "$1" >> "./$3"' _ {} "$ARCHIVE_INDEX" "$ARCHIVE_CONTENT" \; } function extract_file { CHUNK=$(awk -F '^' -v needle="$1" 'BEGIN { sum = 0 } $2 == needle { print sum " " $1; exit 1 } $2 != needle { sum += $1 }' "./$ARCHIVE_INDEX") if [[ "$?" != "1" ]] then exit 1 fi IFS=" " read -ra OFFLIM <<< "$CHUNK" dd if="./$ARCHIVE_CONTENT" of="/tmp/dumpdata" bs=1 skip="${OFFLIM[0]}" count="${OFFLIM[1]}" && \ cat /tmp/dumpdata rm /tmp/dumpdata } function extract_all { OFFSET=0 mkdir -p "$1" while read LISTENTRY do echo $LISTENTRY ITEMSIZE=$(cut -d^ -f1 <<< "$LISTENTRY") ITEMNAME="$1/$(cut -d^ -f2 <<< $LISTENTRY)" mkdir -p "$(dirname $ITEMNAME)" dd if="./$ARCHIVE_CONTENT" of="$ITEMNAME" bs=1 skip="$OFFSET" count="$ITEMSIZE" OFFSET=$(expr $OFFSET + $ITEMSIZE) done < "./$ARCHIVE_INDEX" } if [[ "$1" == "create" ]] then create_packageset elif [[ "$1" == "extract" ]] then extract_file "./$2" elif [[ "$1" == "extractall" ]] then extract_all "/tmp/dumpie" elif [[ "$1" == "squash" ]] then create_packageset # tar czvf index.catpak.tgz "./$ARCHIVE_INDEX" "./$ARCHIVE_CONTENT" # rm "./$ARCHIVE_INDEX" "./$ARCHIVE_CONTENT" bzip2 "./$ARCHIVE_CONTENT" elif [[ "$1" == "unsquash" ]] then bzip2 -d -c "./$ARCHIVE_CONTENT.bz2" > "./$ARCHIVE_CONTENT" # tar xzvf index.catpak.tgz extract_file "./$2" # rm "./$ARCHIVE_INDEX" "./$ARCHIVE_CONTENT" rm "./$ARCHIVE_CONTENT" fi