You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
1.7 KiB
93 lines
1.7 KiB
8 years ago
|
#include <iostream>
|
||
|
#include <unistd.h>
|
||
|
#include "Crypto.h"
|
||
|
#include "RouterInfo.h"
|
||
|
|
||
|
|
||
|
static void usage(const char * argv)
|
||
|
{
|
||
|
std::cout << "usage: " << argv << " [-6|-f|-p] routerinfo.dat" << std::endl;
|
||
|
}
|
||
|
|
||
|
template<typename Addr>
|
||
|
static void write_firewall_entry(std::ostream & o, Addr addr)
|
||
|
{
|
||
|
|
||
|
std::string proto;
|
||
|
if(addr.transportStyle == i2p::data::RouterInfo::eTransportNTCP) {
|
||
|
proto = "tcp";
|
||
|
} else if (addr.transportStyle == i2p::data::RouterInfo::eTransportSSU) {
|
||
|
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);
|
||
|
int opt;
|
||
|
bool ipv6 = false;
|
||
|
bool firewall = false;
|
||
|
bool port = false;
|
||
|
while((opt = getopt(argc, argv, "6fp")) != -1) {
|
||
|
switch(opt) {
|
||
|
case '6':
|
||
|
ipv6 = true;
|
||
|
break;
|
||
|
case 'f':
|
||
|
firewall = true;
|
||
|
break;
|
||
|
case 'p':
|
||
|
port = 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<i2p::data::RouterInfo::Address> addrs;
|
||
|
auto a = ri.GetNTCPAddress(!ipv6);
|
||
|
if(a)
|
||
|
addrs.push_back(*a);
|
||
|
a = ri.GetSSUAddress(!ipv6);
|
||
|
if(a)
|
||
|
addrs.push_back(*a);
|
||
|
|
||
|
if(firewall)
|
||
|
std::cout << "# ";
|
||
|
std::cout << ri.GetIdentHashBase64() << std::endl;
|
||
|
|
||
|
for (const auto & a : addrs) {
|
||
|
|
||
|
if(firewall) {
|
||
|
write_firewall_entry(std::cout, a);
|
||
|
} else {
|
||
|
std::cout << a.host;
|
||
|
|
||
|
if (port)
|
||
|
std::cout << ":" << a.port;
|
||
|
}
|
||
|
std::cout << std::endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|