#!/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.6 AUTHORNAME="Michelle Konzack" AUTHORMAIL="linux4michelle tamay-dogan net" LICENSE=$(gettext 'This tool is under GNU GPL version 3.0') LICENSE_LONG=/usr/share/common-licenses/GPL-3 ######################################################################## if [ "${MCVFS_DEBUG}" = "true" ] ; then gettext 'Input parameters:' 1>&2 echo -e "0: $0\n1: $1\n2: $2\n3: $3\n4: $4\n\n" 1>&2 fi ######################################################################## TDMC_CACHE=/tmp/tdmc_cache-${LOGNAME} if [ ! -d ${TDMC_CACHE} ] ; then mkdir -p ${TDMC_CACHE} chmod -R 700 ${TDMC_CACHE} fi if [ -f "${HOME}/.mc/${EXENAME}" ] ; then TIMEOUT=$(cat ${HOME}/.mc/${EXENAME}) else TIMEOUT=120 fi ######################################################################## if [ -n "$(echo ",list,copyin,rm,mkdir,rmdir," |grep ",$1,")" ] ; then MD5=`echo "$2" |md5sum |sed 's|\ .*||'` ARCHIVENAME=${TDMC_CACHE}/${MD5}_${PPID} if [ -n "$(find ${TDMC_CACHE} -maxdepth 1 -mindepth 1 -mmin +${TIMEOUT} -name ${MD5}_${PPID} 2>/dev/null)" ] ; 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 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=`LC_ALL=en_US date --date="${VAL_date} ${VAL_time}" +"%b %d %Y %H:%M"` VAL_dati=`LC_ALL=en_US date --date="${VAL_date} ${VAL_time}" +"%m-%d-%Y %H:%M"` VAL_path=`echo "${LINE}" |cut -d ' ' -f6- |sed 's|/$||g'` VAL_links=1 echo "${VAL_path} ${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 ' ' -f2- |grep '^d'`" ] ; then echo "${LINE}" fi done } DIRS=`fnc_foo1` fnc_foo2() { (cat ${TMPFILE}) | while read LINE do if [ -z "`echo "${LINE}" |cut -d ' ' -f2 |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|\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*-.*-.* .*:.*\)$|\2 \3 \4 \5 \6 \7 \1|g' rm --force ${TMPFILE} #======================================================================= elif [ "$1" = "copyout" ] ; then TMPFILE=`mktemp -t tdmc.XXXXXX || exit 1` echo "$3" >${TMPFILE} tar --extract --numeric-owner --to-stdout --files-from ${TMPFILE} --file ${ARCHIVENAME} >"$4" rm --force ${TMPFILE} #======================================================================= elif [ "$1" = "copyin" ] ; then TMP_DIR=`mktemp -t -d tdmc.XXXXXX || exit 1` DIRNAME=${TMP_DIR}/`dirname "$3"` DIRNAME=`echo "${DIRNAME}" |sed 's|/\.$||'` FILENAME=`basename "$3"` mkdir -p ${DIRNAME} ln -s ${PWD}/${FILENAME} ${DIRNAME}/${FILENAME} FN=`dirname "$3"`/${FILENAME} FN=`echo "${FN}" |sed 's|\./||'` tar --update --numeric-owner --dereference --directory ${TMP_DIR} --file ${ARCHIVENAME} ${FN} rm --force ${DIRNAME}/* BN=`basename ${TMP_DIR}` cd ${TMP_DIR} && cd .. && rmdir --parents `echo "${DIRNAME}" |sed "s|.*${BN}|${BN}|" |sed 's|\.$||'` #======================================================================= elif [ "$1" = "rm" ] ; then tar --delete --file "${ARCHIVENAME}" "$3" 2>/dev/null if [ $? -ne 0 ] ; then tar --delete --file "${ARCHIVENAME}" "./$3" 2>/dev/null fi #======================================================================= elif [ "$1" = "mkdir" ] ; then TMP_DIR=`mktemp -t -d tdmc.XXXXXX || exit 1` mkdir -p ${TMP_DIR}/"$3" tar --update --numeric-owner --directory ${TMP_DIR} --file "${ARCHIVENAME}" "$3" cd ${TMP_DIR} && rmdir --parents "$3" #======================================================================= elif [ "$1" = "rmdir" ] ; then tar --delete --file "${ARCHIVENAME}" "$3" 2>/dev/null if [ $? -ne 0 ] ; then tar --delete --file "${ARCHIVENAME}" "./$3" 2>/dev/null fi #======================================================================= elif [ "$1" = "run" ] ; then gettext 'VFS#tar: what is "run"?\n\n' 1>&2 echo -e "0: $0\n1: $1\n2: $2\n3: $3\n4: $4\n\n" 1>&2 #======================================================================= else T0=$(gettext 'Usage: ${libdir}/extfs/prefix command [arguments]') T1=$(gettext ' list archivename') T2=$(gettext ' copyout archivename storedfilename extractto') T3=$(gettext ' copyin archivename storedfilename sourcefile') T4=$(gettext ' rm archivename storedfilename') T5=$(gettext ' mkdir archivename dirname') T6=$(gettext ' rmdir archivename dirname') T6=$(gettext ' run ???') echo -e "${T0}\n\n${T1}\n${T2}\n${T3}\n${T4}\n${T5}\n${T6}" exit 1 fi ######################################################################## if [ -n "$(echo ",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 TIMEOUT=$((TIMEOUT+1)) find ${TDMC_CACHE} -type f -mmin +${TIMEOUT} -exec rm --force {} ';'