#!/bin/bash # # # Copyright 2008, Michelle Konzack All rights reserved. # # # # Redistribution and use in source and binary forms, with or without # # modification, are permitted provided that the following conditions # # are met: # # # # 1. Redistributions of source code must retain the above copyright # # notice, this list of conditions and the following disclaimer. # # # # 2. Redistributions in binary form must reproduce the above # # copyright notice, this list of conditions and the following # # disclaimer in the documentation and/or other materials provided # # with the distribution. # # # # 3. Neither the name of Michelle Konzack nor the names of its # # contributors may be used to endorse or promote products derived # # from this software without specific prior written permission. # # # # THIS SOFTWARE IS PROVIDED BY MICHELLE KONZACK AND CONTRIBUTORS # # ``AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT # # NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND # # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT # # SHALL MICHELLE KONZACK OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, # # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # EXENAME=tdmc_tar PKGNAME=tdmc if [ -n "$(which gettext.sh)" ] ; then . gettext.sh else gettext() { echo "$1" } eval_gettext() { eval 'echo $1' } fi export TEXTDOMAIN=${PKGNAME} export TEXTDOMAINDIR=/usr/share/locale VERSION=0.0.2 AUTHORNAME="Michelle Konzack" AUTHORMAIL="linux4michelle freenet de" LICENSE=$(gettext 'This tool is under GNU GPL version 3.0') LICENSE_LONG=/usr/share/common-licenses/GPL-3 ######################################################################## if [ "${MCVFS_DEBUG}" = "true" ] ; then STRG="------------------------" date --rfc-822 >>${HOME}/.mc/mcvfs_debug echo -e "0: $0\n1: $1\n2: $2\n3: $3\n4: $4" >>${HOME}/.mc/mcvfs_debug echo "${STRG}${STRG}${STRG}" >>${HOME}/.mc/mcvfs_debug fi ######################################################################## if [ -n "$(echo ",list,copyout,copyin,rm,mkdir,rmdir," |grep ",$1,")" ] ; then ARCHIVENAME=/tmp/`echo "$2" |md5sum |sed 's|\ .*||'` find /tmp -name "`basename ${ARCHIVENAME}`" -mmin -30 -maxdepth 1 -mindepth 1 >/dev/null 2>&1 if [ $? -ne 0 ] ; then rm --force ${ARCHIVENAME} fi if [ ! -f ${ARCHIVENAME} ] ; then if [ -n "$(echo "$2" |grep '.tar.bz2$' )" ] ; then bzcat "$2" >${ARCHIVENAME} elif [ -n "$(echo "$2" |grep '.tar.gz$' )" ] ; then zcat "$2" >${ARCHIVENAME} else cat "$2" >${ARCHIVENAME} fi fi fi ######################################################################## if [ "$1" = "list" ] ; then fnc_list() { TMPFILE=`mktemp -t tdmc.XXXXXX || exit 1` (tar --list --numeric-owner --verbose --file ${ARCHIVENAME} |tr -s ' ') | while read LINE do VAL_mode=`echo "${LINE}" |cut -d ' ' -f1` VAL_ugid=`echo "${LINE}" |cut -d ' ' -f2` VAL_uid=`echo ${VAL_ugid} |cut -d '/' -f1` VAL_gid=`echo ${VAL_ugid} |cut -d '/' -f2` VAL_size=`echo "${LINE}" |cut -d ' ' -f3` VAL_date=`echo "${LINE}" |cut -d ' ' -f4` VAL_time=`echo "${LINE}" |cut -d ' ' -f5` VAL_dati=`date --date="${VAL_date} ${VAL_time}" +"%b %d %Y %H:%M"` VAL_path=`echo "${LINE}" |cut -d ' ' -f6- |sed 's|/$||g'` VAL_links=1 echo "${VAL_path} 0 ${VAL_mode} ${VAL_links} ${VAL_uid} ${VAL_gid} ${VAL_size} ${VAL_dati}" >>${TMPFILE} done fnc_foo1() { (cat ${TMPFILE}) | while read LINE do if [ -n "`echo "${LINE}" |cut -d ' ' -f3- |grep '^d'`" ] ; then echo "${LINE}" fi done } DIRS=`fnc_foo1` fnc_foo2() { (cat ${TMPFILE}) | while read LINE do if [ -z "`echo "${LINE}" |cut -d ' ' -f3 |grep --regexp='^d'`" ] ; then echo "${LINE}" fi done (echo "${DIRS}") | while read LINE do DIR1="`echo "${LINE}" |cut -d ' ' -f1 |sed 's|$|/|'`" if [ -z "`grep --regexp="${DIR1}" ${TMPFILE}`" ] ; then echo "${LINE}" fi done } fnc_foo2 | sort | sed 's|\(.*\) 0 \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)$|\2 \3 \4 \5 \6 \7 \8 \9 \1|g' rm --force ${TMPFILE} } fnc_list #======================================================================= elif [ "$1" = "copyout" ] ; then fnc_copyout() { TMPFILE=`mktemp -t tdmc.XXXXXX || exit 1` echo "$2" >${TMPFILE} tar --extract --numeric-owner --to-stdout --files-from ${TMPFILE} --file $1 >$3 rm --force ${TMPFILE} } fnc_copyout "${ARCHIVENAME}" "$3" "$4" #======================================================================= elif [ "$1" = "copyin" ] ; then fnc_copyin() { TMP_DIR=`mktemp -t -d tdmc.XXXXXX || exit 1` DIRNAME=${TMP_DIR}/`dirname $2` DIRNAME=`echo "${DIRNAME}" |sed 's|/\.$||'` FILENAME=`basename $2` mkdir -p ${DIRNAME} ln -s ${PWD}/${FILENAME} ${DIRNAME}/${FILENAME} FN=`dirname $2`/${FILENAME} FN=`echo "${FN}" |sed 's|\./||'` tar --update --numeric-owner --dereference --directory ${TMP_DIR} --file $1 ${FN} rm --force ${DIRNAME}/* BN=`basename ${TMP_DIR}` cd ${TMP_DIR} && cd .. && rmdir --parents `echo "${DIRNAME}" |sed "s|.*${BN}|${BN}|" |sed 's|\.$||'` } fnc_copyin "${ARCHIVENAME}" "$3" "$4" >>${HOME}/.mc/mcvfs_debug #======================================================================= elif [ "$1" = "rm" ] ; then fnc_rm() { tar --delete --file $1 $2 2>/dev/null if [ $? -ne 0 ] ; then tar --delete --file $1 ./$2 2>/dev/null fi } fnc_rm "${ARCHIVENAME}" "$3" #======================================================================= elif [ "$1" = "mkdir" ] ; then gettext 'VFS#tar: It is not possibel to create empty directories in an archive.' 1>&2 #======================================================================= elif [ "$1" = "rmdir" ] ; then gettext 'VFS#tar: It is not possibel to remove empty directories in an archive.' 1>&2 #======================================================================= elif [ "$1" = "run" ] ; then gettext 'VFS#tar: what is "run"?' 1>&2 #======================================================================= else gettext 'Usage: ${libdir}/extfs/prefix command [arguments]' 1>&2 echo "" 1>&2 gettext ' list archivename' 1>&2 gettext ' copyout archivename storedfilename extractto' 1>&2 gettext ' copyin archivename storedfilename sourcefile' 1>&2 gettext ' rm archivename storedfilename' 1>&2 gettext ' mkdir archivename dirname' 1>&2 gettext ' rmdir archivename dirname' 1>&2 gettext ' run ???' 1>&2 exit 1 fi ######################################################################## if [ -n "$(echo ",copyout,copyin,rm,mkdir,rmdir," |grep ",$1,")" ] ; then if [ -n "$(echo "$2" |grep '.tar.bz2$')" ] ; then bzip2 <${ARCHIVENAME} >$2 elif [ -n "$(echo "$2" |grep '.tar.gz$')" ] ; then gzip <${ARCHIVENAME} >$2 else cat ${ARCHIVENAME} >$2 fi fi