#!/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 source $AK_LIBDIR/_ak_log # 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"