diff --git a/contrib/py/lnproxy/lnproxy/__main__.py b/contrib/py/lnproxy/lnproxy/__main__.py index d55f47bfe..6ecc03a70 100644 --- a/contrib/py/lnproxy/lnproxy/__main__.py +++ b/contrib/py/lnproxy/lnproxy/__main__.py @@ -50,6 +50,11 @@ class Context: self._ctx = self._ln.lokinet_context_new() self._addrmap = dict() self._debug = debug + lvl = 'none' + if self._debug: + lvl = 'debug' + self._ln.lokinet_log_level(ctypes.create_string_buffer(lvl.encode('ascii'))) + def free(self, ptr): self._c.free(ptr) @@ -99,6 +104,9 @@ class Context: self.stop() self._ln_call("lokinet_context_free") + def set_netid(self, netid): + self._ln.lokinet_set_netid(ctypes.create_string_buffer(netid.encode('ascii'))) + class Stream: def __init__(self, ctx): @@ -115,7 +123,7 @@ class Stream: addr = result.local_address.decode('ascii') port = result.local_port self._id = result.stream_id - print("connect to {} made via {}:{} via {}".format(remote, addr, port, self._id)) + print("connection to {} made via {}:{} via {}".format(remote, addr, port, self._id)) return addr, port @@ -135,7 +143,7 @@ def read_and_forward_or_close(readfd, writefd): else: return read > 0 -ctx = Context() +ctx = None class Handler(BaseHandler): @@ -169,8 +177,6 @@ class Handler(BaseHandler): sockfd = sock.makefile('rwb') sel.register(self.rfile.fileno(), selectors.EVENT_READ, lambda x : read_and_forward_or_close(x, sockfd)) sel.register(sock.fileno(), selectors.EVENT_READ, lambda x : read_and_forward_or_close(x, self.wfile)) - - print("running") while True: events = sel.select(1) if not events: @@ -191,6 +197,8 @@ ap.add_argument("--ip", type=str, help="ip to bind to", default="127.0.0.1") ap.add_argument("--port", type=int, help="port to bind to", default=3000) ap.add_argument("--expose", type=int, help="expose a port to loopback") ap.add_argument("--bootstrap", type=str, help="bootstrap file", default="bootstrap.signed") +ap.add_argument("--netid", type=str, help="override network id") +ap.add_argument("--debug", action="store_const", const=True, default=False, help="enable verose logging") if bootstrapFromURL: ap.add_argument("--bootstrap-url", type=str, help="bootstrap from remote url", default="https://seed.lokinet.org/lokinet.signed") @@ -198,6 +206,12 @@ args = ap.parse_args() addr = (args.ip, args.port) server = Server(addr, Handler) +ctx = Context(args.debug) + +if args.netid is not None: + print("overriding netid: {}".format(args.netid)) + ctx.set_netid(args.netid) + if os.path.exists(args.bootstrap): with open(args.bootstrap, 'rb') as f: if ctx.add_bootstrap(f.read()) == 0: @@ -211,6 +225,7 @@ if args.bootstrap_url is not None: else: print("failed") +print("starting up...") if ctx.start() != 0: print("failed to start") ctx.stop() @@ -219,7 +234,7 @@ if ctx.start() != 0: id = None try: - while not ctx.wait_for_ready(1000): + while not ctx.wait_for_ready(500): print("waiting for lokinet...") lokiaddr = ctx.addr() print("we are {}".format(lokiaddr)) diff --git a/include/lokinet.h b/include/lokinet.h index b8aceab04..54707938b 100644 --- a/include/lokinet.h +++ b/include/lokinet.h @@ -16,12 +16,28 @@ extern "C" struct lokinet_context* lokinet_context_new(); + /// change our network id globally across all contexts + void + lokinet_set_netid(const char*); + + /// get our current netid + /// must be free()'d after use + const char* + lokinet_get_netid(); + /// load a bootstrap RC from memory /// return 0 on success /// return non zero on fail int lokinet_add_bootstrap_rc(const char*, size_t, struct lokinet_context*); + /// set log level + /// possible values: trace, debug, info, warn, error, none + /// return 0 on success + /// return non zero on fail + int + lokinet_log_level(const char*); + /// free a context allocated by lokinet_context_new void lokinet_context_free(struct lokinet_context*); diff --git a/llarp/lokinet_shared.cpp b/llarp/lokinet_shared.cpp index 814c751e9..9e4f0f25c 100644 --- a/llarp/lokinet_shared.cpp +++ b/llarp/lokinet_shared.cpp @@ -52,9 +52,9 @@ struct lokinet_context } [[nodiscard]] auto - endpoint() const + endpoint(std::string name = "default") const { - return impl->router->hiddenServiceContext().GetEndpointByName("default"); + return impl->router->hiddenServiceContext().GetEndpointByName(name); } std::unordered_map streams; @@ -138,6 +138,30 @@ extern "C" return g_context.get(); } + void + lokinet_set_netid(const char* netid) + { + llarp::NetID::DefaultValue() = llarp::NetID{reinterpret_cast(netid)}; + } + + const char* + lokinet_get_netid() + { + const auto netid = llarp::NetID::DefaultValue().ToString(); + return strdup(netid.c_str()); + } + + int + lokinet_log_level(const char* level) + { + if (auto maybe = llarp::LogLevelFromString(level)) + { + llarp::SetLogLevel(*maybe); + return 0; + } + return -1; + } + char* lokinet_address(struct lokinet_context* ctx) { @@ -187,6 +211,8 @@ extern "C" if (not ctx) return -1; auto lock = ctx->acquire(); + ctx->config->router.m_netId = lokinet_get_netid(); + ctx->config->logging.m_logLevel = llarp::GetLogLevel(); ctx->runner = std::make_unique([ctx]() { llarp::util::SetThreadName("llarp-mainloop"); ctx->impl->Configure(ctx->config); diff --git a/llarp/router_contact.cpp b/llarp/router_contact.cpp index e6844a69a..60e288c90 100644 --- a/llarp/router_contact.cpp +++ b/llarp/router_contact.cpp @@ -40,7 +40,7 @@ namespace llarp NetID::NetID(const byte_t* val) { - size_t len = strnlen(reinterpret_cast(val), size()); + const size_t len = strnlen(reinterpret_cast(val), size()); std::copy(val, val + len, begin()); } diff --git a/llarp/service/session.cpp b/llarp/service/session.cpp index d16acf41d..bf710dcdd 100644 --- a/llarp/service/session.cpp +++ b/llarp/service/session.cpp @@ -25,7 +25,7 @@ namespace llarp if (forever) return false; const auto lastUsed = std::max(lastSend, lastRecv); - if(lastUsed == 0s) + if (lastUsed == 0s) return intro.IsExpired(now); return now > lastUsed && (now - lastUsed > lifetime || intro.IsExpired(now)); }