diff options
Diffstat (limited to 'bin/ak-sm-filesplitter')
-rwxr-xr-x | bin/ak-sm-filesplitter | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/bin/ak-sm-filesplitter b/bin/ak-sm-filesplitter new file mode 100755 index 0000000..c675870 --- /dev/null +++ b/bin/ak-sm-filesplitter @@ -0,0 +1,136 @@ +#!/bin/bash +# +# The concept is simple +# +# 1. For a given file we split in 1MB files inside a temporary directory +# +# 2. We then create a map file, containing the resulted files and their sha512sum +# +# 3. We move the files to our $CHKDIR named after their checksums +# +# We ultimately want to be seeding the file so +# +# 4. We append the checksum of the original file with its name into the map file +# +# 5. We rename the map file after its checksum and move it to maps directory +# +# 6. We are done! +# + +# Uncomment next line if you want to debug +# set -xe +PROGRAM="$(basename $0)" + +if [ ! -f "$1" ] +then + echo "[ERROR] File not found" + exit 1 +else + FILE="$1" +fi + +# The directory where the chunked data will be living at +CHKDIR="$AK_WORKDIR/ftr/" +# The directory for the map files so we can reconstruct the file +FILEMAPSDIR="$AK_WORKDIR/fmp/" +# A temporary root dir to work on +TEMPORARYDIR="/tmp/tltmp" +# A subdir to split the files there +TECHDIR="/tmp/tltmp/chks/" +# A pin point to return from where we came from +CURRENTDIR="$(pwd)/" + +# Our snippet for logging debug info +logit(){ + ak-logthis "<$PROGRAM>" "$1" "$2" +} + +# Checking directories and create them if necessary + +# TECHDIR +if [ ! -d "$TECHDIR" ] +then + mkdir -p "$TECHDIR" + if [ "$?" == 0 ] + then + logit "[INFO]" "Folder $TECHDIR created!" + else + logit "[ERROR]" "Problem occured while creating $TECHDIR" + echo "[ERROR] Can't create $TECHDIR" + exit 1 + fi +else + logit "[INFO]" "Temp dir found" +fi + +# FILEMAPSDIR +if [ ! -d "$FILEMAPSDIR" ] +then + mkdir -p "$FILEMAPSDIR" + if [ "$?" == 0 ] + then + logit "[INFO]" "Folder $FILEMAPSDIR created!" + else + logit "[ERROR]" "Problem occured while creating $FILEMAPSDIR" + echo "[ERROR] Can't create $FILEMAPSDIR" + exit 1 + fi +else + logit "[INFO]" "Mapsdir found" +fi + +# CHKDIR +if [ ! -d "$CHKDIR" ] +then + mkdir -p "$CHKDIR" + if [ "$?" == 0 ] + then + logit "[INFO]" "Folder $CHKDIR created!" + else + logit "[ERROR]" "Problem occured while creating $CHKDIR" + echo "[ERROR] Can't create $CHKDIR" + exit 1 + fi +else + logit "[INFO]" "Workdir found" +fi + +# Uncomment next line in case you want to debug the resulting script as well +# echo 'set -xe' > $TEMPORARYDIR/cmd_queue.sh + +# We get the SHA512 hash for the $FILE given +CHECKSUM=$(sha512sum "$FILE"|awk '{print $1}') + +# We split the file into 1048576 bytes and output the chunks into TECHDIR +split -b 1048576 --additional-suffix ".chk" -d "$FILE" "$TECHDIR$(basename "$FILE")-" + +# We go over there... +cd $TECHDIR + +# We get every chunks' SHA512 and we craft a script to rename the chunks and +# move them to CHKDIR +sha512sum * > $TEMPORARYDIR/map; while IFS="" read -r p || [ -n "$p" ] +do + echo $p | awk '{print "mv " $2 " '$CHKDIR'" $1}' >> $TEMPORARYDIR/cmd_queue.sh +done < $TEMPORARYDIR/map + +# We run the crafted script +sh $TEMPORARYDIR/cmd_queue.sh + +# and we delete it +rm $TEMPORARYDIR/cmd_queue.sh + +# We inform the map about the original $FILE name and SHA512 +echo "$CHECKSUM $(basename "$FILE")" >> $TEMPORARYDIR/map + +# We get the SHA512 hash of the resulted map file +MAPFILEHASH="$(sha512sum $TEMPORARYDIR/map | awk '{ print $1 }')" + +# and we rename it with it and move it to FILEMAPSDIR +`sha512sum $TEMPORARYDIR/map | awk '{print "mv " $2 " '$FILEMAPSDIR'" $1}'` + +# We remove the TEMPORARYDIR +rm -rf $TEMPORARYDIR + +# and print the MAPFILEHASH +echo "$MAPFILEHASH" |