From 2ed0ab1ca14c0a85516cf2024684fca17c5f6953 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Sun, 4 Apr 2021 07:33:17 -0400 Subject: [PATCH] liblokinet and lnproxy updates * add lokinet_status function to get the current status of the context, aka are we ready to send or not. * catch some exceptions in lnproxy --- contrib/py/lnproxy/lnproxy/__main__.py | 20 +++++++++++++++++--- include/lokinet.h | 7 +++++++ llarp/lokinet_shared.cpp | 13 +++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/contrib/py/lnproxy/lnproxy/__main__.py b/contrib/py/lnproxy/lnproxy/__main__.py index 6ecc03a70..9f9001cfa 100644 --- a/contrib/py/lnproxy/lnproxy/__main__.py +++ b/contrib/py/lnproxy/lnproxy/__main__.py @@ -67,6 +67,9 @@ class Context: def wait_for_ready(self, ms): return self.ln_call("lokinet_wait_for_ready", ms) == 0 + def ready(self): + return self.ln_call("lokinet_status") == 0 + def addr(self): return self._ln.lokinet_address(self._ctx).decode('ascii') @@ -100,6 +103,10 @@ class Context: if addr in self._addrmap: return self._addrmap[addr] + def delAddr(self, addr): + if addr in self._addrmap: + del self._addrmap[addr] + def __del__(self): self.stop() self._ln_call("lokinet_context_free") @@ -153,10 +160,17 @@ class Handler(BaseHandler): def connect(self, host): global ctx + if not ctx.ready(): + self.send_error(501) + return + if not ctx.hasAddr(host): stream = Stream(ctx) - - result = stream.connect(host) + result = None + try: + result = stream.connect(host) + except: + pass if not result: self.send_error(503) return @@ -166,7 +180,7 @@ class Handler(BaseHandler): try: sock.connect(ctx.getAddr(host)) except: - self.delAddr(host) + ctx.delAddr(host) self.send_error(504) return diff --git a/include/lokinet.h b/include/lokinet.h index 54707938b..96f8b88a1 100644 --- a/include/lokinet.h +++ b/include/lokinet.h @@ -48,6 +48,13 @@ extern "C" int lokinet_context_start(struct lokinet_context*); + /// return 0 if we our endpoint has published on the network and is ready to send + /// return -1 if we don't have enough paths ready + /// retrun -2 if we look deadlocked + /// retrun -3 if context was null or not started yet + int + lokinet_status(struct lokinet_context*); + /// wait at most N milliseconds for lokinet to build paths and get ready /// return 0 if we are ready /// return nonzero if we are not ready diff --git a/llarp/lokinet_shared.cpp b/llarp/lokinet_shared.cpp index 9e4f0f25c..7cfe254f3 100644 --- a/llarp/lokinet_shared.cpp +++ b/llarp/lokinet_shared.cpp @@ -240,6 +240,19 @@ extern "C" return 0; } + int + lokinet_status(struct lokinet_context* ctx) + { + if (ctx == nullptr) + return -3; + auto lock = ctx->acquire(); + if (not ctx->impl->IsUp()) + return -3; + if (not ctx->impl->LooksAlive()) + return -2; + return ctx->endpoint()->IsReady() ? 0 : -1; + } + int lokinet_wait_for_ready(int ms, struct lokinet_context* ctx) {