aboutsummaryrefslogtreecommitdiff
path: root/bin/ak-zchain-chk
blob: 1d9a2f7ec6d18b4dc8eb31a224639a877f6b5972 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/bin/bash
##
##    -h, --help                  Prints this help message
##
PROGRAM="$(basename $0)"
source $AK_LIBDIR/_ak_log
source $AK_LIBDIR/_ak_ipfs

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 $AK_ZLATEST)"
elif [ ! -z "$1" ] && [ "$1" == "-n" ] || [ "$1" == "--chain" ]
then
    entrance="$(_ak_ipns_resolve $2)"
elif [ ! -z "$1" ]
then
    entrance="$1"
else
    # By default we ak-enter from the latest block
    # We can alter this by changing this value
    entrance="$(cat $AK_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 $AK_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="$(_ak_make_temp_directory)"
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
            _ak_log_info "Examining $zblock"

            # We create files named after each ZBLOCK IPFS CID for later
            # reference. Files are empty.
            touch $AK_ZBLOCKDIR/$zblock
            _ak_log_info "Created reference"

            # We concatenate the zblock's contents, pipe them through filter
            # ak-json2bash and output them to tmp-file
            _ak_ipfs_cat $zblock | ak-json2bash > tmp-zblock
            _ak_log_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 tmp-zblock
            _ak_log_info "ZBLOCK SOURCED"

            # Same as above applies to BLOCK and DATA subparts of each ZBLOCK
            # BLOCKS
            _ak_ipfs_cat $block | ak-json2bash > tmp-block
            source tmp-block
            _ak_log_info "BLOCK $block SOURCED"
            touch $AK_BLOCKDIR/$block
            _ak_log_info "BLOCK REFERENCED"
            module="$(echo $action | sed -e 's/\// /g' | awk '{ print $1 }')"
            _ak_log_info "DATA is $module module."
            command="$(echo $action | sed -e 's/\// /g' | awk '{ print $2 }')"
            _ak_log_info "COMMAND is $command"
            if [ ! -v $timestamp ]
            then
                echo "$timestamp : $zblock -> $block -> $previous"
                blocks_found[$counter]="$block"
            fi
            touch $AK_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
                _ak_log_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
                        _ak_ipfs_cat $value | jq -M
                    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"
            _ak_log_info "Counter $counter"
            exit 0
        fi
    # And finally, if nothing is there exit with error
    else
        _ak_log_error "Check not passed... No previous IPFS CID"
        exit 1
    fi
done