views:

334

answers:

1

Hi,

I have absolutly no idea how to unpack the created archive. I give you the complete Script. A Debian based Distibution named Univention uses this to backup several files in an tar archive.

The real archive is packed in an function. The main Content where they create the actual tar file is:

cat "$TMPDIR/freeinfo.txt" >> "$TMPDIR/Installinfo.txt" 2>/dev/null
echo >$TMPDIR/endtag.txt
echo "%%%%OXBACKUP_${DATE}_HEADER_ENDTAG" >> "$TMPDIR/endtag.txt"

BACKUPINFO="$BACKUPINFO endtag.txt"


cat 2>/dev/null << EOF > "$TMPDIR/Installinfo.sh"
BACKUPHOSTNAME="$hostname"
BACKUPDOMAINNAME="$domainname"
BACKUPBASEDN="$ldap_base"
BACKUPTIMEZONE="$(cat /etc/timezone)"
BACKUPLANG="$(echo $locale_default)"
BACKUPSAMBADOM="$windows_domain"
BACKUPSAMBAINSTALLED="$SAMBAINSTALLED"
BACKUPOXINTEGRATIONVERSION="$INTEGRATIONVERSION"
BACKUPSECLEVEL="$(univention-config-registry get version/security-patchlevel)"
BACKUPVERSION=2
SECRETFILES="$SECRETFILES"
OTHERFILES="$OTHERFILES"
OXCONFIG="$OXCONFIG"
CRONTABS="$CRONTABS"
CERTFILES="$CERTFILES"
EOF

pstatus=()

#
# the actual backup to stdout
#
    sync ; sync ; sync

RETVAL=$(
(tar cO $BACKUPINFO 2>/dev/null
tar cO $SECRETFILES 2>/dev/null
tar cO $OTHERFILES 2>/dev/null
tar cO $OXCONFIG 2>/dev/null
tar cO $CRONTABS 2>/dev/null
tar cO $CERTFILES 2>/dev/null
[ -f $EXTRAFILES ] && tar --no-recursion -T $EXTRAFILES -cO 2>/dev/null
tar --no-recursion --null -T dirlist_mailandfilestore -cO 2>/dev/null
tar --null -T filelist_mailandfilestore -cO 2>/dev/null
tar --no-recursion --null -T dirlist_shares -cO 2>/dev/null
tar --null -T filelist_shares -cO 2>/dev/null
) |

#help us out with smbclient, perl, scp until we get a working curl

case "$BACKUPPROTOCOL" in
##stripped protocol specific stuff ... (*) is the way to go!

        (*)     dd 2>>${LOGFILE}_${DATE} > ${BACKUPPATH:-$DEFAULTBACKUPPATH}/backup_$DATE && echo "201"

                chmod 640 "${BACKUPPATH}/backup_$DATE" >/dev/null 2>&1
                chown root:www-data "${BACKUPPATH}/backup_$DATE" >/dev/null 2>&1

                if [[ x"$BACKUPPATH" != x && "$BACKUPPATH" != "$DEFAULTBACKUPPATH" ]] ; then
                        # temporary permissions fix
                        ln -sf "${BACKUPPATH}/backup_$DATE" "$DEFAULTBACKUPPATH/"
                fi
        ;;

esac
)

the archive is 54 GB on the system, tar xvf extract only the first level of the archive. Sorry hard to explain. All in all I only get 40MB out of this 54GB. All the Dirs that should be in the archive are not extracted.

The use of $((tar ... tar ... ) | dd > foo)

is also totally unknown to me, what does this script do?

I think I found a solution myself ( I updated the script a little bit): The Script generates a tag which marks the end of the first archive. I used grep -A1 -a -b "HEADER_ENDTAG" backup.tar Value was 41247795 dd skip=41247795 if=../../backup of=test

Looks like I could now extract the "real" archive. Is there another way to automatically jump to this byte offset, e.g. without using grep manually?

+1  A: 

Your script appears to concatenate several tar files together into a single large file. To extract a single section, I use a shell function / script like this:

File tarsection:

#!/bin/sh
tar_section() {
   local x=1;
   while [ $x -lt $1 ]; do
      tar t > /dev/null || echo "Error in section $x" >&2
      x=$(( $x+1 ))
   done
   shift
   tar f - "$@"
} 

tarfile="$1"
shift
tar_section "$@" < "$tarfile"

Then you can do (for example, for part 3 of the big file):

tarsection YOUR_54GB_BACKUP_FILE 3 -t | less
cd ...extractlocation
tarsection YOUR_54GB_BACKUP_FILE 3 -x
Gregor
thats it. Thank you very much!
evildead