diff --git a/src/api/docs/content/specs/info.yaml b/src/api/docs/content/specs/info.yaml index 6be2b1acd..1899c0029 100644 --- a/src/api/docs/content/specs/info.yaml +++ b/src/api/docs/content/specs/info.yaml @@ -710,24 +710,52 @@ components: type: object properties: allowed: - type: integer - description: Number of allowed domains - example: 10 + type: object + properties: + total: + type: integer + description: Number of allowed domains (total) + example: 67906 + enabled: + type: integer + description: Number of allowed domains (enabled) + example: 4 denied: - type: integer - description: Number of denied domains - example: 3 + type: object + properties: + total: + type: integer + description: Number of denied domains (total) + example: 4 + enabled: + type: integer + description: Number of denied domains (enabled) + example: 2 regex: type: object properties: allowed: - type: integer - description: Number of allowed regex filters - example: 4 + type: object + properties: + total: + type: integer + description: Number of allowed regex filters (total) + example: 67906 + enabled: + type: integer + description: Number of allowed regex filters (enabled) + example: 4 denied: - type: integer - description: Number of denied regex filters - example: 2 + type: object + properties: + total: + type: integer + description: Number of denied regex filters (total) + example: 10 + enabled: + type: integer + description: Number of denied regex filters (enabled) + example: 2 privacy_level: type: integer description: Currently used privacy level diff --git a/src/api/info.c b/src/api/info.c index 16df56ba4..a69dab936 100644 --- a/src/api/info.c +++ b/src/api/info.c @@ -544,10 +544,14 @@ static int get_ftl_obj(struct ftl_conn *api, cJSON *ftl) const int db_groups = counters->database.groups; const int db_lists = counters->database.lists; const int db_clients = counters->database.clients; - const int db_allowed_exact = counters->database.domains.allowed.exact; - const int db_denied_exact = counters->database.domains.denied.exact; - const int db_allowed_regex = counters->database.domains.allowed.regex; - const int db_denied_regex = counters->database.domains.denied.regex; + const int db_allowed_exact_total = counters->database.domains.allowed.exact.total; + const int db_allowed_exact_enabled = counters->database.domains.allowed.exact.enabled; + const int db_denied_exact_total = counters->database.domains.denied.exact.total; + const int db_denied_exact_enabled = counters->database.domains.denied.exact.enabled; + const int db_allowed_regex_total = counters->database.domains.allowed.regex.total; + const int db_allowed_regex_enabled = counters->database.domains.allowed.regex.enabled; + const int db_denied_regex_total = counters->database.domains.denied.regex.total; + const int db_denied_regex_enabled = counters->database.domains.denied.regex.enabled; const int clients_total = counters->clients; const int privacylevel = config.misc.privacylevel.v.privacy_level; const double qps = get_qps(); @@ -571,14 +575,26 @@ static int get_ftl_obj(struct ftl_conn *api, cJSON *ftl) JSON_ADD_NUMBER_TO_OBJECT(database, "lists", db_lists); JSON_ADD_NUMBER_TO_OBJECT(database, "clients", db_clients); + cJSON *domains_allowed = JSON_NEW_OBJECT(); + JSON_ADD_NUMBER_TO_OBJECT(domains_allowed, "total", db_allowed_exact_total); + JSON_ADD_NUMBER_TO_OBJECT(domains_allowed, "enabled", db_allowed_exact_enabled); + cJSON *domains_denied = JSON_NEW_OBJECT(); + JSON_ADD_NUMBER_TO_OBJECT(domains_denied, "total", db_denied_exact_total); + JSON_ADD_NUMBER_TO_OBJECT(domains_denied, "enabled", db_denied_exact_enabled); cJSON *domains = JSON_NEW_OBJECT(); - JSON_ADD_NUMBER_TO_OBJECT(domains, "allowed", db_allowed_exact); - JSON_ADD_NUMBER_TO_OBJECT(domains, "denied", db_denied_exact); + JSON_ADD_ITEM_TO_OBJECT(domains, "allowed", domains_allowed); + JSON_ADD_ITEM_TO_OBJECT(domains, "denied", domains_denied); JSON_ADD_ITEM_TO_OBJECT(database, "domains", domains); + cJSON *regex_allowed = JSON_NEW_OBJECT(); + JSON_ADD_NUMBER_TO_OBJECT(regex_allowed, "total", db_allowed_regex_total); + JSON_ADD_NUMBER_TO_OBJECT(regex_allowed, "enabled", db_allowed_regex_enabled); + cJSON *regex_denied = JSON_NEW_OBJECT(); + JSON_ADD_NUMBER_TO_OBJECT(regex_denied, "total", db_denied_regex_total); + JSON_ADD_NUMBER_TO_OBJECT(regex_denied, "enabled", db_denied_regex_enabled); cJSON *regex = JSON_NEW_OBJECT(); - JSON_ADD_NUMBER_TO_OBJECT(regex, "allowed", db_allowed_regex); - JSON_ADD_NUMBER_TO_OBJECT(regex, "denied", db_denied_regex); + JSON_ADD_ITEM_TO_OBJECT(regex, "allowed", regex_allowed); + JSON_ADD_ITEM_TO_OBJECT(regex, "denied", regex_denied); JSON_ADD_ITEM_TO_OBJECT(database, "regex", regex); JSON_ADD_ITEM_TO_OBJECT(ftl, "database", database); diff --git a/src/database/gravity-db.c b/src/database/gravity-db.c index 80086d3bc..e8740a492 100644 --- a/src/database/gravity-db.c +++ b/src/database/gravity-db.c @@ -1000,9 +1000,9 @@ bool gravityDB_getTable(const unsigned char list) // when domains are included in more than one group if(list == GRAVITY_TABLE) querystr = "SELECT DISTINCT domain FROM vw_gravity"; - else if(list == EXACT_BLACKLIST_TABLE) + else if(list == EXACT_DENY_TABLE) querystr = "SELECT domain, id FROM vw_blacklist GROUP BY id"; - else if(list == EXACT_WHITELIST_TABLE) + else if(list == EXACT_ALLOW_TABLE) querystr = "SELECT domain, id FROM vw_whitelist GROUP BY id"; else if(list == REGEX_DENY_TABLE) querystr = "SELECT domain, id FROM vw_regex_blacklist GROUP BY id"; @@ -1073,7 +1073,7 @@ void gravityDB_finalizeTable(void) // Get number of domains in a specified table of the gravity database We return // the constant DB_FAILED and log to FTL.log if we encounter any error -int gravityDB_count(const enum gravity_tables list) +int gravityDB_count(const enum gravity_tables list, const bool total) { if(!gravityDB_opened && !gravityDB_open()) { @@ -1091,17 +1091,21 @@ int gravityDB_count(const enum gravity_tables list) // very low-end devices such as the Raspierry Pi Zero querystr = "SELECT value FROM info WHERE property = 'gravity_count';"; break; - case EXACT_BLACKLIST_TABLE: - querystr = "SELECT COUNT(DISTINCT domain) FROM vw_blacklist"; + case EXACT_DENY_TABLE: + querystr = total ? "SELECT COUNT(*) FROM domainlist WHERE type = 1" + : "SELECT COUNT(*) FROM domainlist WHERE type = 1 AND enabled = 1"; break; - case EXACT_WHITELIST_TABLE: - querystr = "SELECT COUNT(DISTINCT domain) FROM vw_whitelist"; + case EXACT_ALLOW_TABLE: + querystr = total ? "SELECT COUNT(*) FROM domainlist WHERE type = 0" + : "SELECT COUNT(*) FROM domainlist WHERE type = 0 AND enabled = 1"; break; case REGEX_DENY_TABLE: - querystr = "SELECT COUNT(DISTINCT domain) FROM vw_regex_blacklist"; + querystr = total ? "SELECT COUNT(*) FROM domainlist WHERE type = 3" + : "SELECT COUNT(*) FROM domainlist WHERE type = 3 AND enabled = 1"; break; case REGEX_ALLOW_TABLE: - querystr = "SELECT COUNT(DISTINCT domain) FROM vw_regex_whitelist"; + querystr = total ? "SELECT COUNT(*) FROM domainlist WHERE type = 2" + : "SELECT COUNT(*) FROM domainlist WHERE type = 2 AND enabled = 1"; break; case CLIENTS_TABLE: querystr = "SELECT COUNT(1) FROM client"; diff --git a/src/database/gravity-db.h b/src/database/gravity-db.h index 701377772..99d4d3c7c 100644 --- a/src/database/gravity-db.h +++ b/src/database/gravity-db.h @@ -48,7 +48,7 @@ bool gravityDB_getTable(unsigned char list); const char* gravityDB_getDomain(int *rowid); char* get_client_names_from_ids(const char *group_ids) __attribute__ ((malloc)); void gravityDB_finalizeTable(void); -int gravityDB_count(const enum gravity_tables list); +int gravityDB_count(const enum gravity_tables list, const bool total); void check_inaccessible_adlists(void); void check_restored_gravity(void); bool gravity_updated(void); diff --git a/src/datastructure.c b/src/datastructure.c index 6db83f69c..637351921 100644 --- a/src/datastructure.c +++ b/src/datastructure.c @@ -663,14 +663,22 @@ void FTL_reload_all_domainlists(void) gravityDB_reopen(); // Get size of gravity, number of domains, groups, clients, and lists - counters->database.gravity = gravityDB_count(GRAVITY_TABLE); - counters->database.groups = gravityDB_count(GROUPS_TABLE); - counters->database.clients = gravityDB_count(CLIENTS_TABLE); - counters->database.lists = gravityDB_count(ADLISTS_TABLE); - counters->database.domains.allowed.exact = gravityDB_count(EXACT_WHITELIST_TABLE); - counters->database.domains.denied.exact = gravityDB_count(EXACT_BLACKLIST_TABLE); - counters->database.domains.allowed.regex = gravityDB_count(REGEX_ALLOW_TABLE); - counters->database.domains.denied.regex = gravityDB_count(REGEX_DENY_TABLE); + counters->database.gravity = gravityDB_count(GRAVITY_TABLE, false); + counters->database.groups = gravityDB_count(GROUPS_TABLE, false); + counters->database.clients = gravityDB_count(CLIENTS_TABLE, false); + counters->database.lists = gravityDB_count(ADLISTS_TABLE, false); + + counters->database.domains.allowed.exact.total = gravityDB_count(EXACT_ALLOW_TABLE, true); + counters->database.domains.allowed.exact.enabled = gravityDB_count(EXACT_ALLOW_TABLE, false); + + counters->database.domains.denied.exact.enabled = gravityDB_count(EXACT_DENY_TABLE, false); + counters->database.domains.denied.exact.total = gravityDB_count(EXACT_DENY_TABLE, true); + + counters->database.domains.allowed.regex.enabled = gravityDB_count(REGEX_ALLOW_TABLE, false); + counters->database.domains.allowed.regex.total = gravityDB_count(REGEX_ALLOW_TABLE, true); + + counters->database.domains.denied.regex.enabled = gravityDB_count(REGEX_DENY_TABLE, false); + counters->database.domains.denied.regex.total = gravityDB_count(REGEX_DENY_TABLE, true); // Read and compile possible regex filters // only after having called gravityDB_reopen() diff --git a/src/enums.h b/src/enums.h index 0e9febfdd..5908fdee7 100644 --- a/src/enums.h +++ b/src/enums.h @@ -192,8 +192,8 @@ enum gravity_list_type { enum gravity_tables { GRAVITY_TABLE, - EXACT_BLACKLIST_TABLE, - EXACT_WHITELIST_TABLE, + EXACT_DENY_TABLE, + EXACT_ALLOW_TABLE, REGEX_DENY_TABLE, REGEX_ALLOW_TABLE, CLIENTS_TABLE, diff --git a/src/regex.c b/src/regex.c index ecb782629..dc0147896 100644 --- a/src/regex.c +++ b/src/regex.c @@ -720,7 +720,7 @@ static void read_regex_table(const enum regex_type regexid) // Get number of lines in the regex table num_regex[regexid] = 0; - int count = gravityDB_count(tableID); + const int count = gravityDB_count(tableID, false); if(count == 0) { diff --git a/src/shmem.h b/src/shmem.h index 8b2422b7b..35f6708fd 100644 --- a/src/shmem.h +++ b/src/shmem.h @@ -66,12 +66,24 @@ typedef struct { int lists; struct { struct { - int exact; - int regex; + struct { + int total; + int enabled; + } exact; + struct { + int total; + int enabled; + } regex; } allowed; struct { - int exact; - int regex; + struct { + int total; + int enabled; + } exact; + struct { + int total; + int enabled; + } regex; } denied; } domains; } database;