/generate_tox_bootstrap.py (3198cd41259d1954f69283b4e13ce279b4e04c46) (3389 bytes) (mode 100644) (type blob)
#!/usr/bin/python3
# pip3 install jinja2 requests
import datetime
import jinja2
import json
import requests
import socket
json_url = 'https://nodes.tox.chat/json'
tox_bootstrap_template = """
/*
* Generated with generate_tox_bootstrap.py by GDR!
* from {{ json_url }} on {{ now }}
*/
struct bootstrap_node {
char *address;
uint16_t port;
uint8_t key[32];
} bootstrap_nodes[] = {
{% for node in nodes %}
{
"{{ node.ipv4 }}",
{{ node.port }},
{
{{ node.public_key|toxtoc }}
}
},
{% endfor %}
};
struct bootstrap_node tcp_relays[] = {
{% for node in relays %}
{
"{{ node.ipv4 }}",
{{ node.port }},
{
{{ node.public_key|toxtoc }}
}
},
{% endfor %}
};
"""
def toxtoc(value):
"""
A Jinja2 filter to turn a ToxID into two lines of C bytes
"""
def get_16_bytes(value):
"""
Generate 1 line of C code - 16 bytes
@param value a hex string of length 32 (32 hex chars)
"""
if len(value) != 32:
raise ValueError('%r is not a 32-char string')
rv = ""
for i in range(16):
rv += "0x%s" % value[2*i : 2*i+2]
if i < 15:
rv += ", "
return rv
rv = get_16_bytes(value[:32]) + \
",\n" + (12*' ') + \
get_16_bytes(value[32:])
return rv
class Loader(jinja2.BaseLoader):
def get_source(self, environment, template):
return tox_bootstrap_template, 'tox_bootstrap_template', True
if __name__ == "__main__":
r = requests.get(json_url)
data = r.json()
if 'nodes' not in data:
raise ValueError('nodes element not in JSON')
nodes = []
tcp_relays = []
for elem in data['nodes']:
node = {}
if 'ipv4' not in elem or 'port' not in elem or 'public_key' not in elem:
print("SKIPPING", elem)
continue
if len(elem['public_key']) != 64:
print("Bad public key %s, skipping!" % elem['public_key'])
continue
node['port'] = int(elem['port'])
node['public_key'] = elem['public_key']
try:
socket.inet_aton(elem['ipv4'])
node['ipv4'] = elem['ipv4']
except socket.error:
# IPv4 is not numeric, let's try resolving
try:
print("RESOLVING", elem['ipv4'])
node['ipv4'] = socket.gethostbyname(elem['ipv4'])
except socket.error:
print("Could not resolve ipv4: %s, skipping!" % elem['ipv4'])
continue
if 'status_udp' in elem and elem['status_udp']:
nodes.append(node)
if 'tcp_ports' in elem and elem['tcp_ports'] and \
'status_tcp' in elem and elem['status_tcp']:
for port in elem['tcp_ports']:
relay = dict(node)
try:
relay['port'] = int(port)
except ValueError:
continue
tcp_relays.append(relay)
env = jinja2.Environment(loader=Loader())
env.filters['toxtoc'] = toxtoc
template = env.get_template('tox_bootstrap_template')
tox_bootstrap_h = template.render(nodes=nodes, now=datetime.datetime.now(), json_url=json_url, relays=tcp_relays)
open('tox_bootstrap.h', 'w').write(tox_bootstrap_h)
Mode |
Type |
Size |
Ref |
File |
100644 |
blob |
268 |
272c4eb3ad3672621962ce38f8c7472336729ec3 |
.gitignore |
100644 |
blob |
0 |
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 |
.sonarcloud.properties |
100644 |
blob |
2268 |
559acd087c7406a57243ade068efd091c7731b57 |
.travis.yml |
100644 |
blob |
1640 |
a2f23e9c331d20a453c577786cdaa2228f15fc29 |
BUILD.md |
100644 |
blob |
4009 |
c0f5635cfcf87c820042790fce7ea3d27d68d99d |
FAQ.md |
100644 |
blob |
35058 |
2061be2b732ea86101a7c0d5f4df0bbbfb830a30 |
LICENSE.md |
100644 |
blob |
1258 |
808d57cc1b8ef4944a50798b8242f7587684983c |
Makefile |
100644 |
blob |
637 |
ee41cdaf376b4cb8eca51751b170e4c698167dda |
Makefile.mac |
100644 |
blob |
6215 |
b1c263d3db0d2728247d8fea652550653f6c6d1e |
README.md |
100644 |
blob |
1989 |
f1c8658a62d5be3c1726843db101a54df9c52f47 |
VPN.md |
100644 |
blob |
469 |
512fa4cf0643ea1c2a59f24b7e38b37af620e7b6 |
bitbucket-pipelines.yml |
100644 |
blob |
22776 |
3073e5d2a576980632303cf32fb9e568afea3375 |
client.c |
100644 |
blob |
759 |
be68f25ae57282e30acf01fd0eb619763045dc1e |
client.h |
040000 |
tree |
- |
2aa3072e8a8745616761031d04cf49836e23d0a8 |
debian |
100644 |
blob |
3389 |
3198cd41259d1954f69283b4e13ce279b4e04c46 |
generate_tox_bootstrap.py |
100644 |
blob |
265 |
8d1bb5fd5867d5068c9b04dc7456bdd4d42a86bf |
gitversion.c |
100644 |
blob |
62 |
a7474325efaa32bed4b0d14c588e08ad97ebf68c |
gitversion.h |
100644 |
blob |
3141 |
31244349cd221b4e8931f612b3325ae59faa58cb |
log.c |
100644 |
blob |
892 |
bcd4c9bb1af0a1f1c44b1e7a36c3a5971ba73b34 |
log.h |
100644 |
blob |
549 |
a9095f6b9cc0f97ddc698e07a4606b37822ba61c |
mach.c |
100644 |
blob |
287 |
5ac9a4e29fbb831ba2cfa6dc98589ffaf381b91b |
mach.h |
100644 |
blob |
47328 |
809baecd363c78d273d34f1f4d04e12818b6e0b4 |
main.c |
100644 |
blob |
3432 |
17fb9b9b2ec49ec1db69f89b4823d3d732c9b3d8 |
main.h |
040000 |
tree |
- |
9ea39ebb6fd8fb34f1a28a69d445d099d5001a37 |
screenshots |
040000 |
tree |
- |
c9901ad488b9ebc1c2ac4c1e4d8b181f3db48133 |
scripts |
100644 |
blob |
16457 |
368f84e6bd32a2eb99a3cef9c9f17bbe63bf358e |
tox_bootstrap.h |
100644 |
blob |
12536 |
75e9dc5ed9399120416e8da5f24d1ccde41cf901 |
utarray.h |
100644 |
blob |
61492 |
7205c67efa27c66884c8d4d1c8a105d4854a0548 |
uthash.h |
100644 |
blob |
4098 |
3e6a99c0eef2222c99c450bca028ef9b4f0f31ba |
util.c |
100644 |
blob |
638 |
7dced6b423b39797c2589660864ea61cc34d5416 |
util.h |
100644 |
blob |
55882 |
b5f3f04c104785a57d8280c37c1b19b36068e56e |
utlist.h |
100644 |
blob |
11555 |
867442c843dbe6bf096a488e3ce9ec6323809f7f |
utstring.h |
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/gdr/tuntox
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/gdr/tuntox
Clone this repository using git:
git clone git://git.rocketgit.com/user/gdr/tuntox
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main