]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add missing paths (the <id> ones do not work yet)
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 22 Nov 2024 13:12:28 +0000 (14:12 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 11 Feb 2025 15:28:22 +0000 (16:28 +0100)
pdns/recursordist/rec-web-stubs.hh
pdns/recursordist/settings/Makefile.am
pdns/recursordist/settings/cxxsupport.cc
pdns/recursordist/settings/rust/Makefile.am
pdns/recursordist/settings/rust/src/bridge.hh
pdns/recursordist/settings/rust/src/web.rs
pdns/recursordist/ws-recursor.cc

index bf9e68ff01999befb62f4ca810d8d4b2200e64c5..316d84dbabc894088f9733f1ac03095342a7aeec 100644 (file)
@@ -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
 }
index 7bfd21922a656c4a30ef0a3485bb4f472c4a0eb2..8d186d14aaed07bba0123f453a29c210c26ae437 100644 (file)
@@ -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
index 28bb3423f8099abb24c50757315da9263f3c9e5b..b6118e4634afe3a1a2147b3d73710d5271a6848d 100644 (file)
@@ -1454,4 +1454,3 @@ bool pdns::rust::settings::rec::isValidHostname(::rust::Str str)
     return false;
   }
 }
-
index 6299a9f51e027d204db14c4a924b2d0e05d37e4a..6ade7921d08b1f5e1fe720f25df932efb2d4e795 100644 (file)
@@ -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
index 4ab8f387f8e963e87445951f36293cbad1269419..bbaf43dc9deb3be0352b2a6b287caf003a17f2c0 100644 (file)
@@ -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);
 }
index db56e23a7fe00bad1e79624050d58457ba57126f..8151c1a3ac25dfaa6bc138737f20e97f3f398aa0 100644 (file)
@@ -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<()>;
index a2ad5e7c0c2534c02ae8e708c82f188b475e9892..b4fb291ea77802f9f14131dbba25491d817b7f11 100644 (file)
@@ -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>& socket) cons
     yarl.initialize(&req);
     socket->setNonBlocking();
 
-    const struct timeval timeout
-    {
-      g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000
-    };
+    const struct timeval timeout{
+      g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000};
     std::shared_ptr<TLSCtx> 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<void (HttpRequest*, HttpResponse*)>& func, const pdns::rust::web::rec::Request& rustRequest, pdns::rust::web::rec::Response& rustResponse)
+static void rustWrapper(const std::function<void(HttpRequest*, HttpResponse*)>& 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<void (HttpRequest*, HttpResponse*)>&
   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)
 
 }