]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Show all maps status
authorVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 13 Mar 2025 14:36:36 +0000 (14:36 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 13 Mar 2025 14:36:36 +0000 (14:36 +0000)
src/controller.c
src/libserver/maps/map_private.h

index 7b254cec0ec68b35e9041a5800f0ac9f1c1d4237..4cc8cbcc1a2154f0087f3f02782058079dde178d 100644 (file)
@@ -979,12 +979,6 @@ rspamd_controller_handle_maps(struct rspamd_http_connection_entry *conn_ent,
 
                        if (bk->protocol == MAP_PROTO_FILE) {
                                editable = rspamd_controller_can_edit_map(bk);
-
-                               if (!editable && access(bk->uri, R_OK) == -1) {
-                                       /* Skip unreadable and non-existing maps */
-                                       continue;
-                               }
-
                                obj = ucl_object_typed_new(UCL_OBJECT);
                                ucl_object_insert_key(obj, ucl_object_fromint(bk->id),
                                                                          "map", 0, false);
@@ -994,8 +988,34 @@ rspamd_controller_handle_maps(struct rspamd_http_connection_entry *conn_ent,
                                }
                                ucl_object_insert_key(obj, ucl_object_fromstring(bk->uri),
                                                                          "uri", 0, false);
+                               ucl_object_insert_key(obj, ucl_object_fromstring("file"),
+                                                                         "type", 0, false);
                                ucl_object_insert_key(obj, ucl_object_frombool(editable),
                                                                          "editable", 0, false);
+                               ucl_object_insert_key(obj, ucl_object_frombool(map->shared->loaded),
+                                                                         "loaded", 0, false);
+                               ucl_object_insert_key(obj, ucl_object_frombool(map->shared->cached),
+                                                                         "cached", 0, false);
+                               ucl_array_append(top, obj);
+                       }
+                       else {
+                               obj = ucl_object_typed_new(UCL_OBJECT);
+                               ucl_object_insert_key(obj, ucl_object_fromint(bk->id),
+                                                                         "map", 0, false);
+                               if (map->description) {
+                                       ucl_object_insert_key(obj, ucl_object_fromstring(map->description),
+                                                                                 "description", 0, false);
+                               }
+                               ucl_object_insert_key(obj, ucl_object_fromstring(bk->uri),
+                                                                         "uri", 0, false);
+                               ucl_object_insert_key(obj, ucl_object_fromstring(rspamd_map_fetch_protocol_name(bk->protocol)),
+                                                                         "type", 0, false);
+                               ucl_object_insert_key(obj, ucl_object_frombool(false),
+                                                                         "editable", 0, false);
+                               ucl_object_insert_key(obj, ucl_object_frombool(map->shared->loaded),
+                                                                         "loaded", 0, false);
+                               ucl_object_insert_key(obj, ucl_object_frombool(map->shared->cached),
+                                                                         "cached", 0, false);
                                ucl_array_append(top, obj);
                        }
                }
@@ -1020,7 +1040,7 @@ rspamd_controller_handle_get_map(struct rspamd_http_connection_entry *conn_ent,
 {
        struct rspamd_controller_session *session = conn_ent->ud;
        GList *cur;
-       struct rspamd_map *map;
+       struct rspamd_map *map = NULL;
        struct rspamd_map_backend *bk = NULL;
        const rspamd_ftok_t *idstr;
        struct stat st;
@@ -1069,6 +1089,12 @@ rspamd_controller_handle_get_map(struct rspamd_http_connection_entry *conn_ent,
                return 0;
        }
 
+       if (bk->protocol != MAP_PROTO_FILE) {
+               msg_info_session("map %s is not file-based", bk->uri);
+               rspamd_controller_send_error(conn_ent, 400, "Map is not file-based");
+               return 0;
+       }
+
        if (stat(bk->uri, &st) == -1 || (fd = open(bk->uri, O_RDONLY)) == -1) {
                reply = rspamd_http_new_message(HTTP_RESPONSE);
                reply->date = time(NULL);
index 3afc784c9717684653f6289915aca1ef55e8846f..04a14d21e174195e7b16f48e14afef3fb42b5ec5 100644 (file)
@@ -54,6 +54,23 @@ enum fetch_proto {
        MAP_PROTO_STATIC
 };
 
+static const char *
+rspamd_map_fetch_protocol_name(enum fetch_proto proto)
+{
+       switch (proto) {
+       case MAP_PROTO_FILE:
+               return "file";
+       case MAP_PROTO_HTTP:
+               return "http";
+       case MAP_PROTO_HTTPS:
+               return "https";
+       case MAP_PROTO_STATIC:
+               return "static";
+       default:
+               return "unknown";
+       }
+}
+
 /**
  * Data specific to file maps
  */