-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathrouterinfo.cpp
125 lines (109 loc) · 2.36 KB
/
routerinfo.cpp
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
#include <iostream>
#include <unistd.h>
#include "Crypto.h"
#include "RouterInfo.h"
static void usage(const char * argv)
{
std::cout << "usage: " << argv << " [-6|-f|-p|-y] routerinfo.dat" << std::endl;
}
template<typename Addr>
static std::string address_style_string(Addr addr)
{
if(addr->transportStyle == i2p::data::RouterInfo::eTransportNTCP2) {
return "NTCP2";
} else if (addr->transportStyle == i2p::data::RouterInfo::eTransportSSU2) {
return "SSU2";
}
return "???";
}
template<typename Addr>
static void write_firewall_entry(std::ostream & o, Addr addr)
{
std::string proto;
if(addr->transportStyle == i2p::data::RouterInfo::eTransportNTCP2) {
proto = "tcp";
} else if (addr->transportStyle == i2p::data::RouterInfo::eTransportSSU2) {
proto = "udp";
} else {
// bail
return;
}
o << " -A OUTPUT -p " << proto;
o << " -d " << addr->host << " --dport " << addr->port;
o << " -j ACCEPT";
}
int main(int argc, char * argv[])
{
if (argc < 2) {
usage(argv[0]);
return 1;
}
i2p::crypto::InitCrypto(false, true, false);
int opt;
bool ipv6 = false;
bool firewall = false;
bool port = false;
bool yggdrasil = false;
while((opt = getopt(argc, argv, "6fpy")) != -1) {
switch(opt) {
case '6':
ipv6 = true;
break;
case 'f':
firewall = true;
break;
case 'p':
port = true;
break;
case 'y':
yggdrasil = true;
break;
default:
usage(argv[0]);
return 1;
}
}
while(optind < argc) {
int idx = optind;
optind ++;
std::string fname(argv[idx]);
i2p::data::RouterInfo ri(fname);
std::vector<std::shared_ptr<const i2p::data::RouterInfo::Address> > addrs;
auto a = ri.GetPublishedNTCP2V4Address();
if(a)
addrs.push_back(a);
a = ri.GetSSU2V4Address();
if(a)
addrs.push_back(a);
if (ipv6)
{
a = ri.GetPublishedNTCP2V6Address();
if(a)
addrs.push_back(a);
a = ri.GetSSU2V6Address();
if(a)
addrs.push_back(a);
}
if(yggdrasil){
a = ri.GetYggdrasilAddress();
if(a)
addrs.push_back(a);
}
if(firewall)
std::cout << "# ";
else
std::cout << "Router Hash: ";
std::cout << ri.GetIdentHashBase64() << std::endl;
for (const auto & a : addrs) {
if(firewall) {
write_firewall_entry(std::cout, a);
} else {
std::cout << address_style_string(a) << ": " << a->host;
if (port)
std::cout << ":" << a->port;
}
std::cout << std::endl;
}
}
return 0;
}