From ebbf53085c9cba4b9bf4cc1d2860711bcfb1ee83 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Fri, 25 Nov 2016 09:55:22 -0500 Subject: [PATCH] add routerinfo tool --- Makefile | 5 ++- i2pd | 2 +- routerinfo.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 routerinfo.cpp diff --git a/Makefile b/Makefile index f006ad6..a208970 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,10 @@ OBJECTS = $(SOURCES:.cpp=.o) I2PD_LIB = libi2pd.a -all: keygen keyinfo famtool +all: keygen keyinfo famtool routerinfo + +routerinfo: $(OBJECTS) + $(CXX) -o routerinfo routerinfo.o $(LDFLAGS) $(LIBS) keygen: $(OBJECTS) $(CXX) -o keygen keygen.o $(LDFLAGS) $(LIBS) diff --git a/i2pd b/i2pd index 8795f0c..2767ad7 160000 --- a/i2pd +++ b/i2pd @@ -1 +1 @@ -Subproject commit 8795f0c8c45a910284c4c6d6e886d4d9ae746ad9 +Subproject commit 2767ad75ffbda35856c2dffd930fe1b15d17ac8a diff --git a/routerinfo.cpp b/routerinfo.cpp new file mode 100644 index 0000000..9bc752b --- /dev/null +++ b/routerinfo.cpp @@ -0,0 +1,92 @@ +#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 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 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; +}