aboutsummaryrefslogtreecommitdiff
path: root/lib/_ak_network_yggdrasil
blob: 5620fae538c49dc1e0591bab0c4a7853ea7f946e (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
#!/usr/bin/env bash
###
### arching-kaos-tools
### Tools to interact and build an Arching Kaos Infochain
### Copyright (C) 2021 - 2025  kaotisk
###
### This program is free software: you can redistribute it and/or modify
### it under the terms of the GNU General Public License as published by
### the Free Software Foundation, either version 3 of the License, or
### (at your option) any later version.
###
### This program is distributed in the hope that it will be useful,
### but WITHOUT ANY WARRANTY; without even the implied warranty of
### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
### GNU General Public License for more details.
###
### You should have received a copy of the GNU General Public License
### along with this program.  If not, see <http://www.gnu.org/licenses/>.
###
source $AK_LIBDIR/_ak_lib_load
_ak_lib_load _ak_log
_ak_lib_load _ak_datetime

function _ak_network_yggdrasil_scan_full(){
    # This scan is using HIA resources to scan the whole cjdns network for peers
    #
    # Ref:
    #  - https://github.com/ircerr/yia/
    #  - http://yia.yggdrasil-network.ca/watchlist/yia.iplist
    #
    TEMPDIR="$(_ak_make_temp_directory)"
    cd $TEMPDIR
    last_seen="$TEMPDIR/ls"
    pubkeys_ips="$TEMPDIR/pi"
    online_ips="$TEMPDIR/oi"
    online_pairs="$TEMPDIR/op"
    filtered_online_pubkeys_ips="$TEMPDIR/fopi"
    curl -s \
        --connect-timeout 5 \
        "http://yia.yggdrasil-network.ca/crawler/crawler-yia.peers.$(_ak_datetime_human_date_only_yesterday)" > $last_seen
    if [ $? -ne 0 ]
    then
        _ak_log_error "Couldn't fetch active peers from YIA"
        exit 1
    fi
    curl -s \
        --connect-timeout 5 \
        "http://yia.yggdrasil-network.ca/crawler/crawler-yia.pubkey" > $pubkeys_ips
    if [ $? -ne 0 ]
    then
        _ak_log_error "Couldn't fetch public key DB from YIA"
        exit 1
    fi
    cat $last_seen | tr ' ' '\n' | sort | uniq | while read key
    do
        grep ${key} ${pubkeys_ips} >> ${online_pairs}
    done
    counter=0
    count=0
    max="$(cat $online_pairs|wc -l)"
    printf '[' > walk.aknet
    cat $online_pairs \
        | sort \
        | uniq \
        | while read -r pkey ip || [ -n "$ip" ]
    do
        count="$(( $count + 1 ))"
        _ak_log_debug "Scanning [${count}/${max}] $ip..."
        node_fs_path="$AK_ZPEERSDIR/ygg/$(echo -n $ip| sed 's/://g')"
        scan_ts="$(_ak_datetime_unix)"
        if [ ! -d ${node_fs_path} ]
        then
            mkdir -p ${node_fs_path}
            echo ${scan_ts} > ${node_fs_path}/first_seen
            echo ${scan_ts} > ${node_fs_path}/last_seen
        else
            echo ${scan_ts} > ${node_fs_path}/last_seen
        fi
        node_fs_pathname="${node_fs_path}/${scan_ts}_node_info"
        curl \
            --connect-timeout 3 \
            -A 'akd/0.1.0; https://github.com/arching-kaos' \
            "http://[$ip]:8610/v0/node_info" 2>/dev/null | jq -c -M > ${node_fs_pathname}
        node_info="$(cat ${node_fs_pathname})"
        if [ $? -eq 0 ] && [ $(echo -n "$node_info" | wc -c) -gt 0 ]
        then
            ni_hash="$(echo -n "${node_info}" | sha512sum | cut -d ' ' -f 1)"
            if [ ! -f "${node_fs_path}/${ni_hash}" ]
            then
                mv ${node_fs_pathname} ${node_fs_path}/${ni_hash}
                echo "${scan_ts} ${ni_hash}" >> ${node_fs_path}/db
            fi
            if [ "$counter" -ne "0" ]
            then
                printf ',' >> walk.aknet
            fi
            if [ ! -n "$node_info" ]
            then
                node_info="null"
            fi
            printf '{"yggdrasil":{"public_key":"%s","ip":"%s"},"node_info":%s}' \
                "$pkey" "$ip" "$node_info" >> walk.aknet
            counter="`expr $counter + 1`"
        else
            rm ${node_fs_pathname}
        fi
    done
    printf ']' >> walk.aknet
    mv walk.aknet $AK_ZPEERSFILE.yggdrasil
    rm -rf $TEMPDIR
}

function _ak_network_yggdrasil_show_peers(){
    if [ -f $AK_ZPEERSFILE.yggdrasil ]
    then
        cat $AK_ZPEERSFILE.yggdrasil | jq
    else
        _ak_log_debug "No yggdrasil peers found"
    fi
}

function _ak_network_yggdrasil_scan(){
    if [ ! -z $1 ] && [ -n "$1" ]
    then
        _ak_network_yggdrasil_scan_specific $1
    else
        _ak_network_yggdrasil_scan_full
    fi
}

_ak_log_debug "_ak_network_yggdrasil loaded $(caller)"