|
#!/usr/bin/env bash |
|
#Target OS: [Mac, Linux, Unix-like] |
|
|
|
: ' |
|
@func Split and GPG Encrypt a File |
|
@param string require $1 FILE |
|
@param string require $2 FILE_NAME |
|
@param string optional $3 TEST_FILE |
|
@return void |
|
' |
|
function splitAndGpgEncryptFile() { |
|
if [ -z $1 ] |
|
then |
|
echo "${IRed}No Input File! ${Color_Off}Please type a filename as first argument." |
|
return 1; |
|
fi |
|
|
|
if [ -z $2 ] |
|
then |
|
echo "${IRed}No New File name!" |
|
return 1; |
|
fi |
|
|
|
if [ ! -f $1 ] |
|
then |
|
echo "${IRed}File does not exist!" |
|
return 1; |
|
fi |
|
|
|
declare BAR RESOLUTION="0" DURATION="0" |
|
SPLIT_SIZE=$TELEGRAM_MAX_UPLOAD_FILE_SIZE |
|
FILE_SIZE=$(wc -c < $1) |
|
STARTED_AT=$(date +%F" "%T) |
|
DATE=$(date) |
|
FILES="" |
|
|
|
if [ $FILE_SIZE -gt $TELEGRAM_MAX_UPLOAD_FILE_SIZE ] |
|
then |
|
FILE_WILDCARD="$2." |
|
CURRENT_DIRECTORY=$(pwd) |
|
|
|
percentBar 10 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 10%" "Splitting file... \r" |
|
|
|
split -b $SPLIT_SIZE $1 $FILE_WILDCARD 2> /dev/null |
|
|
|
percentBar 20 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 20%" "Encrypting splitted files... \r" |
|
|
|
find $CURRENT_DIRECTORY -name "$FILE_WILDCARD"'a*' -maxdepth 1 | \ |
|
while read i |
|
do |
|
FILE=$(echo $i | grep -Eo "(\w+)$") |
|
FILES+="$FILE_WILDCARD$FILE.gpg," |
|
gpg -c --batch --passphrase-file ~/Downloads/passphrase.txt "$i" 2> /dev/null |
|
rm $i |
|
done |
|
|
|
FILES="${FILES:0:-1}" |
|
|
|
percentBar 40 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 40%" "Testing encrypted files... \r" |
|
if [ ! -z $3 ] && [ $FILE_SIZE -gt $TELEGRAM_MAX_UPLOAD_FILE_SIZE ] |
|
then |
|
DECRYPT=$(decryptAndJoin $2 2>&1 /dev/null) |
|
fi |
|
else |
|
percentBar 20 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 20%" "Encrypting file... \r" |
|
|
|
gpg -c --batch --output "$2.gpg" --passphrase-file ~/Downloads/passphrase.txt "$1" 2> /dev/null |
|
|
|
percentBar 40 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 40%" "Testing encrypted file... \r" |
|
|
|
gpg --batch --passphrase-file ~/Downloads/passphrase.txt --output "$2" --decrypt "$2.gpg" 2> /dev/null |
|
fi |
|
|
|
percentBar 60 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 60%" "Creating stats... \r" |
|
|
|
FILE_IS_VIDEO=$(utils::file-is-video $1) |
|
|
|
if [ $FILE_IS_VIDEO -eq 1 ] |
|
then |
|
utils::file-video-metadata $1 DURATION RESOLUTION |
|
DURATION=$(utils::secondsToHMS $DURATION) |
|
fi |
|
|
|
ENDS_AT=$(date +%F" "%T) |
|
SCREEN=$(splitAndGpgEncryptFile::template $DATE $1 $FILE_SIZE 1 "Completed" $STARTED_AT $ENDS_AT $DURATION $RESOLUTION $2) |
|
|
|
percentBar 80 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 80%" "Hashing file... " |
|
HASH=$(shasum -a 512 $2) |
|
|
|
percentBar 100 25 BAR |
|
echo -ne "\rProgress: \e[44;33;1m$BAR\e[0m at 100%" "Done. " \\n |
|
echo -ne "$SCREEN" \\n |
|
echo $HASH |
|
|
|
printnodeoutput "$2.gpg" $1 $DURATION $RESOLUTION $FILE_SIZE $HASH $FILES |
|
return 0 |
|
} |
|
|
|
: ' |
|
@func Decrypt and Join a GPG file |
|
@param string require $1 FILE |
|
@return void |
|
' |
|
function decryptAndJoin() { |
|
if [ -z $1 ] |
|
then |
|
echo "${IRed}No Input File! ${Color_Off}Please type a filename as first argument." |
|
return 1; |
|
fi |
|
|
|
FINAL_FILE_NAME="${1//\.gpg/}" |
|
|
|
if [ -f $FINAL_FILE_NAME ] |
|
then |
|
echo "${IRed}File already exists! To avoid overwriting it, please remove it manually." |
|
return 1; |
|
fi |
|
|
|
if test -e $1 && [[ $1 == *gpg ]] |
|
then |
|
echo "${IRed}Decrypting a single file: ${On_Red}$1" |
|
echo "${IBlue}Starting at: " $(date) $(date +"%s") "${Color_Off}" |
|
gpg --batch --passphrase-file ~/Downloads/passphrase.txt --output "$FINAL_FILE_NAME" --decrypt "$1" |
|
echo "${IBlue}Finished at: " $(date) $(date +"%s") "${Color_Off}" |
|
echo "Checksum: ${BRed}" $(shasum -a 512 $1) \\n |
|
return 0; |
|
elif ! test -e $1 && ! test -e "$1.aa.gpg" |
|
then |
|
echo "${IRed}Not a valid file." |
|
return 1; |
|
fi |
|
# @todo detect gpg commands errors |
|
echo "${IRed}Decrypting multiple files for: ${On_Red} $1" |
|
CURRENT_DIRECTORY=$(pwd) |
|
|
|
find $CURRENT_DIRECTORY -name "$1"'.a*.gpg' -maxdepth 1 | grep -Eo "$1"'.a\w' | \ |
|
while read i |
|
do |
|
echo "${IBlue}Starting at: " $(date) $(date +"%s") "${Color_Off}" |
|
gpg --batch --passphrase-file ~/Downloads/passphrase.txt --output "$i" --decrypt "$i.gpg" |
|
echo "${IBlue}Finished at: " $(date) $(date +"%s") "${Color_Off}" |
|
done |
|
|
|
echo "${IRed}Joining files for: ${On_Red}$1" |
|
for file in $(find $CURRENT_DIRECTORY -name "$1"'.a*.gpg' -maxdepth 1 | sort | grep -Eo "$1"'.a\w'); do cat $file >> $1; done |
|
|
|
echo "Checksum: ${BRed}" $(shasum -a 512 $1) \\n |
|
} |
|
|
|
|
|
: ' |
|
@func Print File Info to JSON output |
|
@param string require $1 FILE |
|
@param string require $2 NEW_FILE |
|
@return void |
|
' |
|
function outputfileinfo() { |
|
if [ -z $1 ] |
|
then |
|
echo "${IRed}No Input File! ${Color_Off}Please type a filename as first argument." |
|
return 1; |
|
fi |
|
|
|
if [ -z $2 ] |
|
then |
|
echo "${IRed}No New File name!" |
|
return 1; |
|
fi |
|
|
|
FILE=$1 |
|
FILE_IS_VIDEO=$(utils::file-is-video $FILE) |
|
FILE_SIZE=$(wc -c < $FILE) |
|
HASH=$(shasum -a 512 $FILE) |
|
declare RESOLUTION="0" DURATION="0" |
|
FILES="" # @todo calculate number of files based on file size |
|
|
|
if [ $FILE_IS_VIDEO -eq 1 ] |
|
then |
|
utils::file-video-metadata $FILE DURATION RESOLUTION |
|
DURATION=$(utils::secondsToHMS $DURATION) |
|
fi |
|
printnodeoutput "$2.gpg" $1 $DURATION $RESOLUTION $FILE_SIZE $HASH $FILES |
|
return 0 |
|
} |
|
|
|
function printnodeoutput() { |
|
# @todo Implement: Node, Perl, Python, PHP, Ruby |
|
# @todo Refactor $LANG and $EXT assignments |
|
[ $(util::command-exists node) = "false" ] && { echo "Node.js not installed. No input json metadata."; return 1; } || LANG=node |
|
# [ $(util::command-exists python) = "false" ] && { echo "Python not installed. No input json metadata."; return 1; } || BIN=python |
|
# [ $(util::command-exists ruby) = "false" ] && { echo "Ruby not installed. No input json metadata."; return 1; } || BIN=ruby |
|
|
|
LC_ALL=en_US.UTF-8 |
|
ID=$(echo $1 | grep -Eo "^(\w+)") |
|
DATEADDED="$(date '+%m/%d/%Y') 00:00:00" |
|
FILENAME=$(echo $1) |
|
ORIGINAL=$2 |
|
EXTENSION=$(echo $2 | grep -Eo "(\w+)$") |
|
DURATION=$3 |
|
DIMENSION=$4 |
|
FILESIZE=$(printf "%'.0f\n" $5) |
|
FILESIZE_HUM=$(utils::human_print $5) |
|
CHECKSUM=$(echo $6 | grep -Eo "^(\w+)") |
|
FILES=$7 |
|
|
|
case $LANG in |
|
"node") |
|
EXT="js" |
|
;; |
|
"python") |
|
EXT="py" |
|
;; |
|
"ruby") |
|
EXT="rb" |
|
;; |
|
esac |
|
|
|
$LANG $CUSTOM_SCRIPTS/filedatatojson.$EXT $ID \ |
|
$DATEADDED \ |
|
$FILENAME \ |
|
$ORIGINAL \ |
|
$EXTENSION \ |
|
$DURATION \ |
|
$DIMENSION \ |
|
$FILESIZE \ |
|
$FILESIZE_HUM \ |
|
$CHECKSUM \ |
|
$FILES |
|
} |