From: Otto Moerbeek Date: Fri, 22 Nov 2024 13:12:28 +0000 (+0100) Subject: Add missing paths (the ones do not work yet) X-Git-Tag: dnsdist-2.0.0-alpha1~95^2~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47f1f46125214d9e2c096ea4387f19ede25c1891;p=thirdparty%2Fpdns.git Add missing paths (the ones do not work yet) --- diff --git a/pdns/recursordist/rec-web-stubs.hh b/pdns/recursordist/rec-web-stubs.hh index bf9e68ff01..316d84dbab 100644 --- a/pdns/recursordist/rec-web-stubs.hh +++ b/pdns/recursordist/rec-web-stubs.hh @@ -1,15 +1,30 @@ -namespace pdns::rust::web::rec { +namespace pdns::rust::web::rec +{ // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define WRAPPER(A) void A(const Request& /* unused */ , Response& /* unused */) { } +#define WRAPPER(A) \ + void A(const Request& /* unused */, Response& /* unused */) {} -WRAPPER(jsonstat) +WRAPPER(apiDiscovery) +WRAPPER(apiDiscoveryV1) +WRAPPER(apiServer) WRAPPER(apiServerCacheFlush) +WRAPPER(apiServerConfig) +WRAPPER(apiServerConfigAllowFromGET) +WRAPPER(apiServerConfigAllowFromPUT) +WRAPPER(apiServerConfigAllowNotifyFromGET) +WRAPPER(apiServerConfigAllowNotifyFromPUT) WRAPPER(apiServerDetail) +WRAPPER(apiServerRPZStats) +WRAPPER(apiServerSearchData) +WRAPPER(apiServerStatistics) +WRAPPER(apiServerZoneDetailDELETE) +WRAPPER(apiServerZoneDetailGET) +WRAPPER(apiServerZoneDetailPUT) WRAPPER(apiServerZonesGET) WRAPPER(apiServerZonesPOST) +WRAPPER(jsonstat) WRAPPER(prometheusMetrics) WRAPPER(serveStuff) -WRAPPER(apiServerStatistics) #undef WRAPPER } diff --git a/pdns/recursordist/settings/Makefile.am b/pdns/recursordist/settings/Makefile.am index 7bfd21922a..8d186d14aa 100644 --- a/pdns/recursordist/settings/Makefile.am +++ b/pdns/recursordist/settings/Makefile.am @@ -22,7 +22,7 @@ BUILT_SOURCES=cxxsettings-generated.cc rust/src/lib.rs # with an rust/src/lib.rs.h that does not contain e.g. field name or field type changes. # # Use patterns to avoid having two instances of generate run simultaneously, a well-known hack for GNU make -cxxsettings-generated%cc rust/src/lib%rs rust/src/web%rs: table.py generate.py rust-preamble-in.rs rust-bridge-in.rs docs-old-preamble-in.rst docs-new-preamble-in.rst +cxxsettings-generated%cc rust/src/lib%rs: table.py generate.py rust-preamble-in.rs rust-bridge-in.rs docs-old-preamble-in.rst docs-new-preamble-in.rst @if test "$(PYTHON)" = ":"; then echo "Settings table table.py has changed, python is needed to regenerate the related settings files but python was not found. Please install python and re-run configure"; exit 1; fi @if ! $(PYTHON) --version | grep -q "Python 3"; then echo $(PYTHON) should be at least version 3. Please install python 3 and re-run configure; exit 1; fi $(MAKE) -C rust clean diff --git a/pdns/recursordist/settings/cxxsupport.cc b/pdns/recursordist/settings/cxxsupport.cc index 28bb3423f8..b6118e4634 100644 --- a/pdns/recursordist/settings/cxxsupport.cc +++ b/pdns/recursordist/settings/cxxsupport.cc @@ -1454,4 +1454,3 @@ bool pdns::rust::settings::rec::isValidHostname(::rust::Str str) return false; } } - diff --git a/pdns/recursordist/settings/rust/Makefile.am b/pdns/recursordist/settings/rust/Makefile.am index 6299a9f51e..6ade7921d0 100644 --- a/pdns/recursordist/settings/rust/Makefile.am +++ b/pdns/recursordist/settings/rust/Makefile.am @@ -11,7 +11,7 @@ EXTRA_DIST = \ src/web.rs # should actually end up in a target specific dir... -libsettings.a lib.rs.h: src/web.rs src/bridge.rs src/lib.rs src/helpers.rs Cargo.toml Cargo.lock build.rs +libsettings.a lib.rs.h web.rs.h: src/web.rs src/bridge.rs src/lib.rs src/helpers.rs Cargo.toml Cargo.lock build.rs SYSCONFDIR=$(sysconfdir) NODCACHEDIRNOD=$(localstatedir)/nod NODCACHEDIRUDR=$(localstatedir)/udr $(CARGO) build --release $(RUST_TARGET) --target-dir=$(builddir)/target --manifest-path ${srcdir}/Cargo.toml cp target/$(RUSTC_TARGET_ARCH)/release/libsettings.a libsettings.a cp target/$(RUSTC_TARGET_ARCH)/cxxbridge/settings/src/lib.rs.h lib.rs.h diff --git a/pdns/recursordist/settings/rust/src/bridge.hh b/pdns/recursordist/settings/rust/src/bridge.hh index 4ab8f387f8..bbaf43dc9d 100644 --- a/pdns/recursordist/settings/rust/src/bridge.hh +++ b/pdns/recursordist/settings/rust/src/bridge.hh @@ -35,12 +35,25 @@ namespace pdns::rust::web::rec struct KeyValue; struct Request; struct Response; +void apiServer(const Request& rustRequest, Response& rustResponse); +void apiDiscovery(const Request& rustRequest, Response& rustResponse); +void apiDiscoveryV1(const Request& rustRequest, Response& rustResponse); void apiServerCacheFlush(const Request& rustRequest, Response& rustResponse); void apiServerDetail(const Request& rustRequest, Response& rustResponse); void apiServerStatistics(const Request& rustRequest, Response& rustResponse); -void apiServerZonesGET(const Request& rustRequest,Response& rustResponse); +void apiServerZonesGET(const Request& rustRequest, Response& rustResponse); void apiServerZonesPOST(const Request& rustRequest, Response& rustResponse); void prometheusMetrics(const Request& rustRequest, Response& rustResponse); void serveStuff(const Request& rustRequest, Response& rustResponse); void jsonstat(const Request& rustRequest, Response& rustResponse); +void apiServerConfigAllowFromPUT(const Request& rustRequest, Response& rustResponse); +void apiServerConfigAllowFromGET(const Request& rustRequest, Response& rustResponse); +void apiServerConfigAllowNotifyFromGET(const Request& rustRequest, Response& rustResponse); +void apiServerConfigAllowNotifyFromPUT(const Request& rustRequest, Response& rustResponse); +void apiServerConfig(const Request& rustRequest, Response& rustResponse); +void apiServerRPZStats(const Request& rustRequest, Response& rustResponse); +void apiServerSearchData(const Request& rustRequest, Response& rustResponse); +void apiServerZoneDetailGET(const Request& rustRequest, Response& rustResponse); +void apiServerZoneDetailPUT(const Request& rustRequest, Response& rustResponse); +void apiServerZoneDetailDELETE(const Request& rustRequest, Response& rustResponse); } diff --git a/pdns/recursordist/settings/rust/src/web.rs b/pdns/recursordist/settings/rust/src/web.rs index db56e23a7f..8151c1a3ac 100644 --- a/pdns/recursordist/settings/rust/src/web.rs +++ b/pdns/recursordist/settings/rust/src/web.rs @@ -108,6 +108,7 @@ async fn hello( ); } (&Method::PUT, "/api/v1/servers/localhost/cache/flush") => { + request.body = rust_request.collect().await?.to_bytes().to_vec(); api_wrapper( rustweb::apiServerCacheFlush as Func, &request, @@ -115,6 +116,89 @@ async fn hello( headers, ); } + (&Method::PUT, "/api/v1/servers/localhost/config/allow-from") => { + request.body = rust_request.collect().await?.to_bytes().to_vec(); + api_wrapper( + rustweb::apiServerConfigAllowFromPUT as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api/v1/servers/localhost/config/allow-from") => { + api_wrapper( + rustweb::apiServerConfigAllowFromGET as Func, + &request, + &mut response, + headers, + ); + } + (&Method::PUT, "/api/v1/servers/localhost/config/allow-notify-from") => { + request.body = rust_request.collect().await?.to_bytes().to_vec(); + api_wrapper( + rustweb::apiServerConfigAllowNotifyFromPUT as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api/v1/servers/localhost/config/allow-notify-from") => { + api_wrapper( + rustweb::apiServerConfigAllowNotifyFromGET as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api/v1/servers/localhost/config") => { + api_wrapper( + rustweb::apiServerConfig as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api/v1/servers/localhost/rpzstatistics") => { + api_wrapper( + rustweb::apiServerRPZStats as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api/v1/servers/localhost/search-data") => { + api_wrapper( + rustweb::apiServerSearchData as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api/v1/servers/localhost/zones/") => { + api_wrapper( + rustweb::apiServerZoneDetailGET as Func, + &request, + &mut response, + headers, + ); + } + (&Method::PUT, "/api/v1/servers/localhost/zones/") => { + request.body = rust_request.collect().await?.to_bytes().to_vec(); + api_wrapper( + rustweb::apiServerZoneDetailPUT as Func, + &request, + &mut response, + headers, + ); + } + (&Method::DELETE, "/api/v1/servers/localhost/zones/") => { + api_wrapper( + rustweb::apiServerZoneDetailDELETE as Func, + &request, + &mut response, + headers, + ); + } (&Method::GET, "/api/v1/servers/localhost/statistics") => { api_wrapper( rustweb::apiServerStatistics as Func, @@ -148,6 +232,30 @@ async fn hello( headers, ); } + (&Method::GET, "/api/v1/servers") => { + api_wrapper( + rustweb::apiServer as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api/v1") => { + api_wrapper( + rustweb::apiDiscoveryV1 as Func, + &request, + &mut response, + headers, + ); + } + (&Method::GET, "/api") => { + api_wrapper( + rustweb::apiDiscovery as Func, + &request, + &mut response, + headers, + ); + } (&Method::GET, "/metrics") => { rustweb::prometheusMetrics(&request, &mut response).unwrap(); } @@ -287,9 +395,22 @@ mod rustweb { unsafe extern "C++" { include!("bridge.hh"); + fn apiDiscovery(request: &Request, response: &mut Response) -> Result<()>; + fn apiDiscoveryV1(request: &Request, response: &mut Response) -> Result<()>; + fn apiServer(request: &Request, response: &mut Response) -> Result<()>; fn apiServerCacheFlush(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerConfig(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerConfigAllowFromGET(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerConfigAllowFromPUT(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerConfigAllowNotifyFromGET(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerConfigAllowNotifyFromPUT(request: &Request, response: &mut Response) -> Result<()>; fn apiServerDetail(requst: &Request, response: &mut Response) -> Result<()>; + fn apiServerRPZStats(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerSearchData(request: &Request, response: &mut Response) -> Result<()>; fn apiServerStatistics(requst: &Request, response: &mut Response) -> Result<()>; + fn apiServerZoneDetailDELETE(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerZoneDetailGET(request: &Request, response: &mut Response) -> Result<()>; + fn apiServerZoneDetailPUT(request: &Request, response: &mut Response) -> Result<()>; fn apiServerZonesGET(request: &Request, response: &mut Response) -> Result<()>; fn apiServerZonesPOST(requst: &Request, response: &mut Response) -> Result<()>; fn jsonstat(request: &Request, response: &mut Response) -> Result<()>; diff --git a/pdns/recursordist/ws-recursor.cc b/pdns/recursordist/ws-recursor.cc index a2ad5e7c0c..b4fb291ea7 100644 --- a/pdns/recursordist/ws-recursor.cc +++ b/pdns/recursordist/ws-recursor.cc @@ -474,7 +474,6 @@ static void apiServerSearchData(HttpRequest* req, HttpResponse* resp) resp->setJsonBody(doc); } - static void apiServerCacheFlush(HttpRequest* req, HttpResponse* resp) { DNSName canon = apiNameToDNSName(req->getvars["domain"]); @@ -870,10 +869,8 @@ void AsyncWebServer::serveConnection(const std::shared_ptr& socket) cons yarl.initialize(&req); socket->setNonBlocking(); - const struct timeval timeout - { - g_networkTimeoutMsec / 1000, static_cast(g_networkTimeoutMsec) % 1000 * 1000 - }; + const struct timeval timeout{ + g_networkTimeoutMsec / 1000, static_cast(g_networkTimeoutMsec) % 1000 * 1000}; std::shared_ptr tlsCtx{nullptr}; if (d_loglevel > WebServer::LogLevel::None) { socket->getRemote(remote); @@ -958,7 +955,7 @@ void AsyncWebServer::go() void serveRustWeb() { static ::rust::Vec<::rust::String> urls; - for (const auto& [url, _] : g_urlmap) { + for (const auto& [url, _] : g_urlmap) { urls.emplace_back(url); } auto address = ComboAddress(arg()["webserver-address"], arg().asNum("webserver-port")); @@ -978,7 +975,7 @@ static void fromCxxToRust(const HttpResponse& cxxresp, pdns::rust::web::rec::Res } } -static void rustWrapper(const std::function& func, const pdns::rust::web::rec::Request& rustRequest, pdns::rust::web::rec::Response& rustResponse) +static void rustWrapper(const std::function& func, const pdns::rust::web::rec::Request& rustRequest, pdns::rust::web::rec::Response& rustResponse) { HttpRequest request; HttpResponse response; @@ -987,26 +984,49 @@ static void rustWrapper(const std::function& for (const auto& [key, value] : rustRequest.vars) { request.getvars[std::string(key)] = std::string(value); } - func(&request, &response); + request.d_slog = g_slog; // XXX + response.d_slog = g_slog; // XXX + try { + func(&request, &response); + } + catch (HttpException& e) { + response.body = e.response().body; + response.status = e.response().status; + } fromCxxToRust(response, rustResponse); } -namespace pdns::rust::web::rec { +namespace pdns::rust::web::rec +{ // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define WRAPPER(A) void A(const Request& rustRequest, Response& rustResponse) { rustWrapper(::A, rustRequest, rustResponse); } +#define WRAPPER(A) \ + void A(const Request& rustRequest, Response& rustResponse) { rustWrapper(::A, rustRequest, rustResponse); } void jsonstat(const Request& rustRequest, Response& rustResponse) { rustWrapper(RecursorWebServer::jsonstat, rustRequest, rustResponse); } +WRAPPER(apiDiscovery) +WRAPPER(apiDiscoveryV1) +WRAPPER(apiServer) WRAPPER(apiServerCacheFlush) +WRAPPER(apiServerConfig) +WRAPPER(apiServerConfigAllowFromGET) +WRAPPER(apiServerConfigAllowFromPUT) +WRAPPER(apiServerConfigAllowNotifyFromGET) +WRAPPER(apiServerConfigAllowNotifyFromPUT) WRAPPER(apiServerDetail) +WRAPPER(apiServerRPZStats) +WRAPPER(apiServerSearchData) +WRAPPER(apiServerStatistics) +WRAPPER(apiServerZoneDetailDELETE) +WRAPPER(apiServerZoneDetailGET) +WRAPPER(apiServerZoneDetailPUT) WRAPPER(apiServerZonesGET) WRAPPER(apiServerZonesPOST) WRAPPER(prometheusMetrics) WRAPPER(serveStuff) -WRAPPER(apiServerStatistics) }