From 2411fe494cfe4a10c728edc93663950ef2014c43 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Mon, 6 Mar 2023 13:36:30 +0800 Subject: [PATCH] feat: assets support multiple sources, ref #3 --- include/loader/loader.h | 3 +- include/utils/assets.h | 30 ++++++++-- src/cleardns.c | 70 ++++++++++++++++++---- src/loader/loader.c | 16 ++--- src/utils/assets.c | 129 ++++++++++++++++++++++++++++------------ 5 files changed, 184 insertions(+), 64 deletions(-) diff --git a/include/loader/loader.h b/include/loader/loader.h index fb68648..5369ef7 100644 --- a/include/loader/loader.h +++ b/include/loader/loader.h @@ -15,7 +15,8 @@ struct cleardns { overture *diverter; adguard *filter; crontab *crond; - assets *resource; + // TODO: update assets ptr +// assets *resource; }; extern struct cleardns loader; diff --git a/include/utils/assets.h b/include/utils/assets.h index 7f7eb1d..a73a641 100644 --- a/include/utils/assets.h +++ b/include/utils/assets.h @@ -2,13 +2,31 @@ #define ASSETS_H_ typedef struct { - char **update_file; - char **update_url; -} assets; + char *file; // string + char **sources; // string list +} asset; -assets* assets_init(); -void assets_free(assets *info); -void assets_load(assets *info); +asset* asset_init(const char *name); +//void asset_add_src(asset *res, const char *src); + +asset** assets_init(); +void assets_append(asset ***asset_list, asset *res); + +void assets_free(asset **asset_list); + +//void asset_free(asset *res); +uint32_t assets_size(asset **asset_list); + +void assets_dump(asset **asset_list); + +//typedef struct { +// char **update_file; +// char **update_url; +//} assets; + +//assets* assets_init(); +//void assets_free(assets *info); +//void assets_load(assets *info); void assets_extract(); diff --git a/src/cleardns.c b/src/cleardns.c index a58d73d..4ed8be7 100644 --- a/src/cleardns.c +++ b/src/cleardns.c @@ -87,14 +87,14 @@ void cleardns() { // cleardns service log_info("Start loading process"); process_list_init(); - assets_load(loader.resource); +// assets_load(loader.resource); process_list_append(dnsproxy_load("Domestic", loader.domestic, "domestic.json")); process_list_append(dnsproxy_load("Foreign", loader.foreign, "foreign.json")); process_list_append(overture_load(loader.diverter, "overture.json")); overture_free(loader.diverter); dnsproxy_free(loader.domestic); dnsproxy_free(loader.foreign); - assets_free(loader.resource); +// assets_free(loader.resource); if (loader.crond != NULL) { process_list_append(crontab_load(loader.crond)); // free crontab struct later } @@ -119,23 +119,69 @@ void cleardns() { // cleardns service int main(int argc, char *argv[]) { - char **demo = string_list_init(); + LOG_LEVEL = LOG_DEBUG; - string_list_append(&demo, "item 1"); - string_list_append(&demo, "item 2"); - string_list_append(&demo, "item 3"); - string_list_append(&demo, "item 4"); - string_list_append(&demo, "item 5"); + asset *res_1 = asset_init("demo 1"); + asset *res_2 = asset_init("demo 2"); + asset *res_3 = asset_init("demo 3"); - char *tmp = string_list_dump(demo); - log_warn("dump -> %s", tmp); + string_list_append(&res_1->sources, "item a1"); + string_list_append(&res_1->sources, "item a2"); + string_list_append(&res_1->sources, "item a3"); + +// asset_add_src(res_1, "item a1"); +// asset_add_src(res_1, "item a2"); +// asset_add_src(res_1, "item a3"); + + string_list_append(&res_2->sources, "item b1"); + string_list_append(&res_2->sources, "item b2"); + +// asset_add_src(res_2, "item b1"); +// asset_add_src(res_2, "item b2"); + + string_list_append(&res_3->sources, "item c1"); + +// asset_add_src(res_3, "item c1"); + + asset **res = assets_init(); + log_info("res init size: %d", assets_size(res)); + + assets_append(&res, res_1); + assets_append(&res, res_2); + assets_append(&res, res_3); + + log_info("res size: %d", assets_size(res)); + + assets_dump(res); + +// asset_free(res_1); +// asset_free(res_2); +// asset_free(res_3); + + assets_free(res); + +// char **res_1 = string_list_init(); +// char **res_2 = string_list_init(); +// char **res_3 = string_list_init(); +// +// string_list_append(&res_1, "item a1"); +// string_list_append(&res_1, "item a2"); +// string_list_append(&res_1, "item a3"); +// +// string_list_append(&res_2, "item b1"); +// string_list_append(&res_2, "item b2"); +// +// string_list_append(&res_3, "item c"); + +// char *tmp = string_list_dump(demo); +// log_warn("dump -> %s", tmp); // assets_log_init(TRUE); assets_log_init(FALSE); - rust_assets_update("test.txt", demo, ASSETS_DIR); +// rust_assets_update("test.txt", demo, ASSETS_DIR); - string_list_free(demo); +// string_list_free(demo); log_warn("test end"); exit(0); diff --git a/src/loader/loader.c b/src/loader/loader.c index 09b3bd2..28285cb 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -127,12 +127,13 @@ crontab* load_crond(cleardns_config *config) { return crond; } -assets* load_assets(cleardns_config *config) { - assets *resource = assets_init(); - string_list_update(&resource->update_file, config->assets.update_file); - string_list_update(&resource->update_url, config->assets.update_url); - return resource; -} +// TODO: new assets manager +//assets* load_assets(cleardns_config *config) { +// assets *resource = assets_init(); +// string_list_update(&resource->update_file, config->assets.update_file); +// string_list_update(&resource->update_url, config->assets.update_url); +// return resource; +//} void load_config(const char *config_file) { // parser and load cleardns configure cleardns_config *config = config_init(); @@ -161,7 +162,8 @@ void load_config(const char *config_file) { // parser and load cleardns configur loader.crond = load_crond(config); log_debug("Crond options parser success"); - loader.resource = load_assets(config); + // TODO: update assets loader +// loader.resource = load_assets(config); log_debug("Assets options parser success"); loader.script = string_list_init(); diff --git a/src/utils/assets.c b/src/utils/assets.c index 9f31f42..3be2441 100644 --- a/src/utils/assets.c +++ b/src/utils/assets.c @@ -8,59 +8,112 @@ #include "structure.h" #include "assets.h" -assets update; +//assets update; -void assets_update(); -void assets_dump(assets *info); +//void assets_update(); +//void assets_dump(assets *info); void extract(const char *file); -void assets_free(assets *info) { // free assets mapping - string_list_free(info->update_file); - string_list_free(info->update_url); - free(info); +//void assets_free(assets *info) { // free assets mapping +// string_list_free(info->update_file); +// string_list_free(info->update_url); +// free(info); +//} + +//assets* assets_init() { // init assets mapping +// assets *info = (assets *)malloc(sizeof(assets)); +// info->update_file = string_list_init(); +// info->update_url = string_list_init(); +// return info; +//} + +asset* asset_init(const char *name) { // init asset item + asset *res = (asset *)malloc(sizeof(asset)); + res->file = strdup(name); + res->sources = string_list_init(); // with multi sources + return res; } -assets* assets_init() { // init assets mapping - assets *info = (assets *)malloc(sizeof(assets)); - info->update_file = string_list_init(); - info->update_url = string_list_init(); - return info; +//void asset_add_src(asset *res, const char *src) { // append source for asset item +// string_list_append(&res->sources, src); +//} +// +//void asset_free(asset *res) { // free asset item +// string_list_free(res->sources); +// free(res->file); +// free(res); +//} + +asset** assets_init() { // init assets list + asset **asset_list = (asset **)malloc(sizeof(asset *)); + *asset_list = NULL; // list end sign + return asset_list; } -void assets_dump(assets *info) { // show assets mapping in debug log - for (char **file = info->update_file; *file != NULL; ++file) { - char **url = file - info->update_file + info->update_url; - log_info("Asset `%s` -> %s", *file, *url); +void assets_free(asset **asset_list) { + for (asset **res = asset_list; *res != NULL; ++res) { + string_list_free((*res)->sources); + free((*res)->file); + free(*res); } + free(asset_list); } -void assets_load(assets *info) { // load assets mapping - update.update_file = string_list_init(); - update.update_url = string_list_init(); - string_list_update(&update.update_file, info->update_file); - string_list_update(&update.update_url, info->update_url); - signal(SIGALRM, assets_update); // receive SIGALRM signal - assets_dump(&update); +uint32_t assets_size(asset **asset_list) { // get size of asset list + uint32_t num = 0; + while(asset_list[num++] != NULL); // get list size + return num - 1; } -void assets_update() { // update all assets - if (!string_list_len(update.update_file)) { // empty assets mapping - log_info("Skip update assets"); - return; - } - log_info("Start assets update"); - for (char **file = update.update_file; *file != NULL; ++file) { - char **url = file - update.update_file + update.update_url; - char *asset_file = string_join(ASSETS_DIR, *file); - log_info("Update asset `%s` -> %s", asset_file, *url); - download_file(asset_file, *url); // download asset from url - free(asset_file); +void assets_dump(asset **asset_list) { + for (asset **res = asset_list; *res != NULL; ++res) { // iterate over each item + char *sources = string_list_dump((*res)->sources); + log_info("Asset item `%s` -> %s", (*res)->file, sources); + free(sources); } - log_info("Restart overture"); - run_command("pgrep overture | xargs kill"); // restart overture - log_info("Assets update complete"); } +void assets_append(asset ***asset_list, asset *res) { // append asset item for asset list + uint32_t len = assets_size(*asset_list); + *asset_list = (asset **)realloc(*asset_list, sizeof(asset *) * (len + 2)); // extend asset list + (*asset_list)[len] = res; + (*asset_list)[len + 1] = NULL; // list end sign +} + +//void assets_dump(assets *info) { // show assets mapping in debug log +// for (char **file = info->update_file; *file != NULL; ++file) { +// char **url = file - info->update_file + info->update_url; +// log_info("Asset `%s` -> %s", *file, *url); +// } +//} + +//void assets_load(assets *info) { // load assets mapping +// update.update_file = string_list_init(); +// update.update_url = string_list_init(); +// string_list_update(&update.update_file, info->update_file); +// string_list_update(&update.update_url, info->update_url); +// signal(SIGALRM, assets_update); // receive SIGALRM signal +// assets_dump(&update); +//} + +//void assets_update() { // update all assets +// if (!string_list_len(update.update_file)) { // empty assets mapping +// log_info("Skip update assets"); +// return; +// } +// log_info("Start assets update"); +// for (char **file = update.update_file; *file != NULL; ++file) { +// char **url = file - update.update_file + update.update_url; +// char *asset_file = string_join(ASSETS_DIR, *file); +// log_info("Update asset `%s` -> %s", asset_file, *url); +// download_file(asset_file, *url); // download asset from url +// free(asset_file); +// } +// log_info("Restart overture"); +// run_command("pgrep overture | xargs kill"); // restart overture +// log_info("Assets update complete"); +//} + void assets_extract() { // init assets and load update process log_info("Start loading assets"); create_folder(ASSETS_DIR);