#!/bin/sh
# IPK Package Utility v0.1
# (C) 2005 Paul F. De La Cruz. Public Domain.
# polito@blackbeanie.net

DATA_BALL="./data.tar.gz"
CTRL_BALL="./control.tar.gz"
EXCL_DATA="--exclude=$DATA_BALL"
EXCL_CTRL="--exclude=$CTRL_BALL"

usage()
{
	EXE=`basename $0`
	echo "IPK Package Utility v0.1"
	echo "(C) 2005 Paul F. De La Cruz. Public Domain."
	echo "E-mail: earl@servercommandos.com"
	echo
	echo "Usage: $EXE [command] <file.ipk> [extract dir]"
	echo
	echo "By default with no command and only an .ipk specified,"
	echo "$EXE simply lists the full contents of the .ipk."
	echo
	echo "--help                 You're reading it."
	echo "$EXE is rather forgiving with command names and you can"
	echo "actually use shorter forms (ie, -list-all, list-all, etc)."
	echo
	echo "Listing Commands:"
	echo "--list-all             Full listing of files contained."
	echo "--list-data            Listing of ./data.tar.gz"
	echo "--list-control         Listing of ./control.tar.gz"
	echo
	echo "Extracting Commands:"
	echo "Will dump .ipk package into a directory named after the"
	echo ".ipk file or to a directory named by [extract dir]."
	echo
	echo "miscellaneous          Extracts to filename/"
	echo "./data.tar.gz          Extracts to filename/data"
	echo "./control.tar.gz       Extracts to filename/control"
	echo
	echo "--dump-all             Extracts all files in archive"
	echo "--dump-data            Extracts ./data.tar.gz only"
	echo "--dump-control         Extracts ./control.tar.gz only"
	echo "--dump-extra           Extracts miscellaneous only"
}

if [ $# -lt 1 ]; then
	usage
	exit
fi

COMMAND=$1
shift
case "$COMMAND" in
	--dump|-dump|--dump-all|-dump-all|dump|dump-all)
		IPKG=$1
		shift
		if [ x"$1" == "x" ]; then
			EXTRACT_DIR=${IPKG%.ipk}
		else
			EXTRACT_DIR=$1
		fi

		CTRL_DIR=$EXTRACT_DIR/control
		DATA_DIR=$EXTRACT_DIR/data

		mkdir -p $CTRL_DIR || exit 1
		mkdir -p $DATA_DIR || exit 1

		cat $IPKG | tar xzf - -O $DATA_BALL | tar xzf - -C $DATA_DIR
		cat $IPKG | tar xzf - -O $CTRL_BALL | tar xzf - -C $CTRL_DIR
		cat $IPKG | tar xzf - $EXCL_DATA $EXCL_CTRL -C $EXTRACT_DIR
	;;
	--dump-control|-dump-control|dump-control)
		IPKG=$1
		shift
		if [ x"$1" == "x" ]; then
			EXTRACT_DIR=${IPKG%.ipk}
		else
			EXTRACT_DIR=$1
		fi

		CTRL_DIR=$EXTRACT_DIR/control

		mkdir -p $CTRL_DIR || exit 1

		cat $IPKG | tar xzf - -O $CTRL_BALL | tar xzf - -C $CTRL_DIR
	;;
	--dump-data|-dump-data|dump-data)
		IPKG=$1
		shift
		if [ x"$1" == "x" ]; then
			EXTRACT_DIR=${IPKG%.ipk}
		else
			EXTRACT_DIR=$1
		fi

		DATA_DIR=$EXTRACT_DIR/data

		mkdir -p $DATA_DIR || exit 1

		cat $IPKG | tar xzf - -O $DATA_BALL | tar xzf - -C $DATA_DIR
	;;
	--dump-extra|-dump-extra|dump-extra)
		IPKG=$1
		shift
		if [ x"$1" == "x" ]; then
			EXTRACT_DIR=${IPKG%.ipk}
		else
			EXTRACT_DIR=$1
		fi

		mkdir -p $EXTRACT_DIR || exit 1

		cat $IPKG | tar xzf - $EXCL_DATA $EXCL_CTRL -C $EXTRACT_DIR
	;;
	--list-data|-list-data|list-data)
		IPKG=$1
		shift
		cat $IPKG | tar xzf - -O $DATA_BALL | tar tvzf -
	;;
	--list-control|-list-control|list-control|--list-ctrl|-list-ctrl|list-ctrl)
		IPKG=$1
		shift
		cat $IPKG | tar xzf - -O $CTRL_BALL | tar tvzf -
	;;
	--list|-list|--list-all|-list-all|list|list-all)
		IPKG=$1
		shift
		echo "--------------- Miscellaneous ---------------"
		cat $IPKG | tar tvzf - $EXCL_DATA $EXCL_CTRL
		echo "---------------    Control    ---------------"
		cat $IPKG | tar xzf - -O $CTRL_BALL | tar tvzf -
		echo "---------------      Data     ---------------"
		cat $IPKG | tar xzf - -O $DATA_BALL | tar tvzf -
	;;
	--help|-help|help)
		usage
	;;
	*)
		IPKG=$COMMAND
		shift
		echo "--------------- Miscellaneous ---------------"
		cat $IPKG | tar tvzf - $EXCL_DATA $EXCL_CTRL
		echo "---------------    Control    ---------------"
		cat $IPKG | tar xzf - -O $CTRL_BALL | tar tvzf -
		echo "---------------      Data     ---------------"
		cat $IPKG | tar xzf - -O $DATA_BALL | tar tvzf -
esac
exit
