#include #include #include "Crypto.h" #include "RouterInfo.h" static void usage(const char * argv) { std::cout << "usage: " << argv << " [-6|-f|-p] routerinfo.dat" << std::endl; } template 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 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; 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 > 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(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; }