aboutsummaryrefslogtreecommitdiff
path: root/bin/ak-zchain-chk
diff options
context:
space:
mode:
Diffstat (limited to 'bin/ak-zchain-chk')
-rwxr-xr-xbin/ak-zchain-chk143
1 files changed, 143 insertions, 0 deletions
diff --git a/bin/ak-zchain-chk b/bin/ak-zchain-chk
new file mode 100755
index 0000000..c75dc4b
--- /dev/null
+++ b/bin/ak-zchain-chk
@@ -0,0 +1,143 @@
+#!/bin/bash
+fix="0"
+usage(){
+ echo "zchain-chk - Check and fix zchain"
+ echo "---------------------------------"
+ echo "Usage:"
+ echo " --help, -h Print this help and exit"
+ echo " --chain <ipns-link>, -n <ipns-link> Crawl specified chain"
+ echo " --fix #TODO Fix your chain"
+ echo ""
+ echo "Note that combined flags don't work for now"
+ echo "Running with no flags crawls your chain"
+}
+
+if [ ! -z "$1" ] && [ "$1" == "-h" ] || [ "$1" == "--help" ]
+then
+ usage
+ exit
+elif [ ! -z "$1" ] && [ "$1" == "-f" ] || [ "$1" == "--fix" ]
+then
+ fix="1"
+ entrance="$(cat $ZLATEST)"
+elif [ ! -z "$1" ] && [ "$1" == "-n" ] || [ "$1" == "--chain" ]
+then
+ entrance="$(ipns-resolve $2)"
+elif [ ! -z "$1" ]
+then
+ entrance="$1"
+else
+ # By default we enter from the latest block
+ # We can alter this by changing this value
+ entrance="$(cat $ZLATEST)"
+fi
+
+# We assign the IPFS CIDv0 of an empty file as this is used
+# as our GENESIS block, hence the "seed" that the tree grows
+# from.
+seed="$(cat $ZGENESIS)"
+
+# We assume that we found the entrance inside a block, hence
+# ZBLOCK is labeled as previous
+zblock="$entrance"
+declare -A blocks_found
+
+# Enter temp folder
+TEMPASSIN="/tmp/aktmp_$(date -u +%s)"
+mkdir $TEMPASSIN
+cd $TEMPASSIN
+counter=0
+
+# The loop
+# We break the loop from inside the loop
+while true
+do
+ if [ $counter == 0 ]
+ then
+ echo 'Start checking'
+ fi
+ counter=$(expr $counter + 1)
+
+ # Check if $zblock exists as variable
+ if [ ! -v $zblock ]
+ then
+ # Check if it is not our seed cause if it is we skip this part
+ if [ "$zblock" != "$seed" ]
+ then
+ # Reset timestamp since it's introduced later
+ timestamp=''
+ # Announce to stdout which ZBLOCK is being read at the moment
+ logthis "[INFO]" "Examining $zblock"
+
+ # We create files named after each ZBLOCK IPFS CID for later
+ # reference. Files are empty.
+ touch $ZBLOCKDIR/$zblock
+ logthis "[INFO]" "Created reference"
+
+ # We concatenate the zblock's contents, pipe them through filter
+ # json2bash and output them to tmp-file
+ ipfs cat $zblock | json2bash > $TEMPASSIN/tmp-zblock
+ logthis "[INFO]" "ZBLOCK $zblock READ"
+
+ # Supposingly you are on a safe environment and you only have
+ # access to your chain, I would consider mild secure to source
+ # the files into your bash.
+ # File an issue/pull request if you think it can be done better!!
+ source $TEMPASSIN/tmp-zblock
+ logthis "[INFO]" "ZBLOCK SOURCED"
+
+ # Same as above applies to BLOCK and DATA subparts of each ZBLOCK
+ # BLOCKS
+ ipfs cat $block | json2bash > $TEMPASSIN/tmp-block
+ source $TEMPASSIN/tmp-block
+ logthis "[INFO]" "BLOCK $block SOURCED"
+ touch $BLOCKDIR/$block
+ logthis "[INFO]" "BLOCK REFERENCED"
+ module="$(echo $action | sed -e 's/\// /g' | awk '{ print $1 }')"
+ logthis "[INFO]" "DATA is $module module."
+ command="$(echo $action | sed -e 's/\// /g' | awk '{ print $2 }')"
+ logthis "[INFO]" "COMMAND is $command"
+ if [ ! -v $timestamp ]
+ then
+ echo "$timestamp : $zblock -> $block -> $previous"
+ blocks_found[$counter]="$block"
+ fi
+ touch $DATADIR/$data
+
+ # Now, since we sourced the BLOCK to our terminal, we can search
+ # for $previous variable. In case we don't find one, we exit with
+ # code 0
+ if [ -v $previous ]
+ then
+ logthis "[ERROR]" "Block $block has no previous zblock"
+ echo "Chain with no genesis"
+ if [ "$fix" == "1" ]
+ then
+ echo "LOL"
+ else
+ echo "Blocks found and need repacking..."
+ for value in ${blocks_found[@]}
+ do
+ echo $value
+ ipfs cat $value | json_pp
+ done
+ fi
+ exit 0
+ # Otherwise, we inform of the sequence
+ else
+ zblock=$previous
+ fi
+ # Now check if it is equal to the seed
+ # which apparently means we reached the seed.
+ elif [ "$zblock" == "$seed" ]
+ then
+ echo "Chain is OK with GENESIS block = $seed"
+ logthis "[INFO]" "Counter $counter"
+ exit 0
+ fi
+ # And finally, if nothing is there exit with error
+ else
+ logthis "[ERROR]" "Check not passed... No previous IPFS CID"
+ exit 1
+ fi
+done