diff --git a/open-app-filter/src/appfilter_config.c b/open-app-filter/src/appfilter_config.c index eb8e7f5..bccdca8 100755 --- a/open-app-filter/src/appfilter_config.c +++ b/open-app-filter/src/appfilter_config.c @@ -1,23 +1,23 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #include #include @@ -35,228 +35,243 @@ static struct uci_context *uci_ctx = NULL; static struct uci_package *uci_appfilter; // static struct uci_package * -config_init_package(const char *config) -{ - struct uci_context *ctx = uci_ctx; - struct uci_package *p = NULL; - - if (!ctx) { - printf("alloc context\n"); - ctx = uci_alloc_context(); - uci_ctx = ctx; - - ctx->flags &= ~UCI_FLAG_STRICT; - //if (config_path) - // uci_set_confdir(ctx, config_path); +config_init_package(const char *config) +{ + struct uci_context *ctx = uci_ctx; + struct uci_package *p = NULL; - } else { - - printf("find context\n"); - p = uci_lookup_package(ctx, config); - if (p) - uci_unload(ctx, p); - } - - if (uci_load(ctx, config, &p)) - return NULL; - - return p; + if (!ctx) + { + ctx = uci_alloc_context(); + uci_ctx = ctx; + ctx->flags &= ~UCI_FLAG_STRICT; + //if (config_path) + // uci_set_confdir(ctx, config_path); + } + else + { + p = uci_lookup_package(ctx, config); + if (p) + uci_unload(ctx, p); + } + + if (uci_load(ctx, config, &p)) + return NULL; + + return p; } -char *get_app_name_by_id(int id){ - int i; - for (i = 0;i < g_app_count; i++){ - if (id == app_name_table[i].id) - return app_name_table[i].name; - } - return ""; +char *get_app_name_by_id(int id) +{ + int i; + for (i = 0; i < g_app_count; i++) + { + if (id == app_name_table[i].id) + return app_name_table[i].name; + } + return ""; } -void init_app_name_table(void){ - int count = 0; - char line_buf[2048] = {0}; +void init_app_name_table(void) +{ + int count = 0; + char line_buf[2048] = {0}; - FILE * fp = fopen("/etc/appfilter/feature.cfg", "r"); - if (!fp){ - printf("open file failed\n"); - return; - } + FILE *fp = fopen("/etc/appfilter/feature.cfg", "r"); + if (!fp) + { + printf("open file failed\n"); + return; + } - while (fgets(line_buf, sizeof(line_buf), fp)){ - if (strstr(line_buf, "#")) - continue; - if (strlen(line_buf) < 10) - continue; - if (!strstr(line_buf, ":")) - continue; - char *pos1 = strstr(line_buf, ":"); - char app_info_buf[128] = {0}; - int app_id; - char app_name[64] = {0}; - memset(app_name, 0x0, sizeof(app_name)); - strncpy(app_info_buf, line_buf, pos1 - line_buf); - sscanf(app_info_buf, "%d %s", &app_id, app_name); - app_name_table[g_app_count].id = app_id; - strcpy(app_name_table[g_app_count].name, app_name); - g_app_count++; - } - fclose(fp); + while (fgets(line_buf, sizeof(line_buf), fp)) + { + if (strstr(line_buf, "#")) + continue; + if (strlen(line_buf) < 10) + continue; + if (!strstr(line_buf, ":")) + continue; + char *pos1 = strstr(line_buf, ":"); + char app_info_buf[128] = {0}; + int app_id; + char app_name[64] = {0}; + memset(app_name, 0x0, sizeof(app_name)); + strncpy(app_info_buf, line_buf, pos1 - line_buf); + sscanf(app_info_buf, "%d %s", &app_id, app_name); + app_name_table[g_app_count].id = app_id; + strcpy(app_name_table[g_app_count].name, app_name); + g_app_count++; + } + fclose(fp); } -void init_app_class_name_table(void){ - char line_buf[2048] = {0}; - int class_id; - char class_name[64] = {0}; - FILE * fp = fopen("/etc/appfilter/app_class.txt", "r"); - if (!fp){ - printf("open file failed\n"); - return; - } - while (fgets(line_buf, sizeof(line_buf), fp)){ - sscanf(line_buf, "%d %s", &class_id, class_name); - strcpy(CLASS_NAME_TABLE[class_id - 1], class_name); - g_cur_class_num++; - } - fclose(fp); +void init_app_class_name_table(void) +{ + char line_buf[2048] = {0}; + int class_id; + char class_name[64] = {0}; + FILE *fp = fopen("/etc/appfilter/app_class.txt", "r"); + if (!fp) + { + printf("open file failed\n"); + return; + } + while (fgets(line_buf, sizeof(line_buf), fp)) + { + sscanf(line_buf, "%d %s", &class_id, class_name); + strcpy(CLASS_NAME_TABLE[class_id - 1], class_name); + g_cur_class_num++; + } + fclose(fp); } //00:00 9:1 int check_time_valid(char *t) { - if (!t) - return 0; - if (strlen(t) < 3 || strlen(t) > 5 || (!strstr(t, ":"))) - return 0; - else - return 1; + if (!t) + return 0; + if (strlen(t) < 3 || strlen(t) > 5 || (!strstr(t, ":"))) + return 0; + else + return 1; } -void dump_af_time(af_ctl_time_t *t){ - int i; - printf("---------dump af time-------------\n"); - printf("%d:%d ---->%d:%d\n", t->start.hour, t->start.min, - t->end.hour, t->end.min); - for (i = 0; i < 7; i++){ - printf("%d ", t->days[i]); - } - printf("\n"); +void dump_af_time(af_ctl_time_t *t) +{ + int i; + printf("---------dump af time-------------\n"); + printf("%d:%d ---->%d:%d\n", t->start.hour, t->start.min, + t->end.hour, t->end.min); + for (i = 0; i < 7; i++) + { + printf("%d ", t->days[i]); + } + printf("\n"); } -af_ctl_time_t *load_appfilter_ctl_time_config(void){ - int ret = 0; - af_ctl_time_t *t = NULL; +af_ctl_time_t *load_appfilter_ctl_time_config(void) +{ + int ret = 0; + af_ctl_time_t *t = NULL; + appfilter_config_alloc(); + struct uci_section *time_sec = uci_lookup_section( + uci_ctx, uci_appfilter, "time"); + if (!time_sec) + { + printf("get time section failed\n"); + return NULL; + } + t = malloc(sizeof(af_ctl_time_t)); + if (!t) + { + return NULL; + } + memset(t, 0x0, sizeof(af_ctl_time_t)); + char *start_time_str = uci_lookup_option_string(uci_ctx, time_sec, "start_time"); - appfilter_config_alloc(); - printf("load time \n"); - struct uci_section *time_sec = uci_lookup_section( - uci_ctx, uci_appfilter, "time"); - if (!time_sec){ - printf("get time section failed\n"); - return NULL; - } - t = malloc(sizeof(af_ctl_time_t)); - if (!t){ - return NULL; - } - memset(t, 0x0, sizeof(af_ctl_time_t)); - char *start_time_str = uci_lookup_option_string(uci_ctx, time_sec, "start_time"); + if (check_time_valid(start_time_str)) + { + sscanf(start_time_str, "%d:%d", &t->start.hour, &t->start.min); + } + else + { + printf("start time check failed\n"); + free(t); + t = NULL; + goto EXIT1; + } + char *end_time_str = uci_lookup_option_string(uci_ctx, time_sec, "end_time"); - if (check_time_valid(start_time_str)){ - sscanf(start_time_str, "%d:%d", &t->start.hour, &t->start.min); - } - else{ - printf("start time check failed\n"); - free(t); - t = NULL; - goto EXIT1; - } - char *end_time_str = uci_lookup_option_string(uci_ctx, time_sec, "end_time"); + if (check_time_valid(end_time_str)) + { + sscanf(end_time_str, "%d:%d", &t->end.hour, &t->end.min); + } + else + { + printf("end time check failed\n"); + free(t); + t = NULL; + goto EXIT2; + } - if (check_time_valid(end_time_str)){ - sscanf(end_time_str, "%d:%d", &t->end.hour, &t->end.min); - } - else{ - printf("end time check failed\n"); - free(t); - t = NULL; - goto EXIT2; - } + char *days_str = uci_lookup_option_string(uci_ctx, time_sec, "days"); - char *days_str = uci_lookup_option_string(uci_ctx, time_sec, "days"); + char *p = strtok(days_str, " "); + do + { + int day = atoi(p); + if (day >= 0 && day <= 6) + t->days[day] = 1; + else + ret = 0; + } while (p = strtok(NULL, " ")); - char *p = strtok(days_str, " "); - do{ - int day = atoi(p); - if (day >= 0 && day <= 6) - t->days[day] = 1; - else - ret = 0; - } - while(p = strtok(NULL, " ")); - - //printf("start:%s, end:%s, days:%s\n", start_time_str, end_time_str, - // days_str); +//printf("start:%s, end:%s, days:%s\n", start_time_str, end_time_str, +// days_str); EXIT3: - if (days_str) - free(days_str); + if (days_str) + free(days_str); EXIT2: - if (end_time_str) - free(end_time_str); + if (end_time_str) + free(end_time_str); EXIT1: - if (start_time_str) - free(start_time_str); - appfilter_config_free(); - //if (t) - // dump_af_time(t); - printf("load af time............ok\n"); - return t; + if (start_time_str) + free(start_time_str); + appfilter_config_free(); + //if (t) + // dump_af_time(t); + return t; } - - -int config_get_appfilter_enable(void){ - int ret = 0; +int config_get_appfilter_enable(void) +{ + int ret = 0; int enable = 0; - af_ctl_time_t *t = NULL; + af_ctl_time_t *t = NULL; - appfilter_config_alloc(); - struct uci_section *global_sec = uci_lookup_section(uci_ctx, uci_appfilter, "global"); - if (!global_sec){ - printf("get time section failed\n"); - return NULL; - } + appfilter_config_alloc(); + struct uci_section *global_sec = uci_lookup_section(uci_ctx, uci_appfilter, "global"); + if (!global_sec) + { + printf("get time section failed\n"); + return NULL; + } - char *enable_opt = uci_lookup_option_string(uci_ctx, global_sec, "enable"); - if (!enable_opt){ + char *enable_opt = uci_lookup_option_string(uci_ctx, global_sec, "enable"); + if (!enable_opt) + { return 0; } - enable = atoi(enable_opt); - printf("enable str = %s, enable = %d\n", enable_opt, enable); - free(enable_opt); - appfilter_config_free(); - return enable; + enable = atoi(enable_opt); + free(enable_opt); + appfilter_config_free(); + return enable; } +int appfilter_config_alloc(void) +{ + char *err; + uci_appfilter = config_init_package("appfilter"); + if (!uci_appfilter) + { + uci_get_errorstr(uci_ctx, &err, NULL); + printf("Failed to load appfilter config (%s)\n", err); + free(err); + return -1; + } -int appfilter_config_alloc(void){ - char *err; - uci_appfilter = config_init_package("appfilter"); - if (!uci_appfilter) { - uci_get_errorstr(uci_ctx, &err, NULL); - printf("Failed to load appfilter config (%s)\n", err); - free(err); - return -1; - } - - return 0; + return 0; } -int appfilter_config_free(void){ - if (uci_appfilter){ - uci_unload(uci_ctx, uci_appfilter); - uci_appfilter = NULL; - } - if (uci_ctx){ - uci_free_context(uci_ctx); - uci_ctx = NULL; - } - +int appfilter_config_free(void) +{ + if (uci_appfilter) + { + uci_unload(uci_ctx, uci_appfilter); + uci_appfilter = NULL; + } + if (uci_ctx) + { + uci_free_context(uci_ctx); + uci_ctx = NULL; + } } diff --git a/open-app-filter/src/appfilter_config.h b/open-app-filter/src/appfilter_config.h index fa1c7fd..1d7174a 100755 --- a/open-app-filter/src/appfilter_config.h +++ b/open-app-filter/src/appfilter_config.h @@ -1,23 +1,23 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #ifndef __APPFILTER_CONFIG_H__ #define __APPFILTER_CONFIG_H__ @@ -27,20 +27,23 @@ extern int g_cur_class_num; extern int g_app_count; extern char CLASS_NAME_TABLE[MAX_APP_TYPE][MAX_CLASS_NAME_LEN]; -typedef struct af_time{ - int hour; - int min; -}af_time_t; -typedef struct af_ctl_time{ - af_time_t start; - af_time_t end; - int days[7]; -}af_ctl_time_t; +typedef struct af_time +{ + int hour; + int min; +} af_time_t; +typedef struct af_ctl_time +{ + af_time_t start; + af_time_t end; + int days[7]; +} af_ctl_time_t; -typedef struct app_name_info{ - int id; - char name[64]; -}app_name_info_t; +typedef struct app_name_info +{ + int id; + char name[64]; +} app_name_info_t; void init_app_name_table(void); void init_app_class_name_table(void); char *get_app_name_by_id(int id); @@ -51,5 +54,4 @@ int appfilter_config_free(void); af_ctl_time_t *load_appfilter_ctl_time_config(void); int config_get_appfilter_enable(void); - #endif diff --git a/open-app-filter/src/appfilter_netlink.c b/open-app-filter/src/appfilter_netlink.c index e15bf97..a3380a1 100755 --- a/open-app-filter/src/appfilter_netlink.c +++ b/open-app-filter/src/appfilter_netlink.c @@ -1,23 +1,23 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #include #include @@ -39,178 +39,191 @@ void appfilter_nl_handler(struct uloop_fd *u, unsigned int ev) { int ret; - int i; - char buf[MAX_NL_RCV_BUF_SIZE]; - struct sockaddr_nl nladdr; - struct iovec iov = {buf, sizeof(buf)}; - struct nlmsghdr *h; + int i; + char buf[MAX_NL_RCV_BUF_SIZE]; + struct sockaddr_nl nladdr; + struct iovec iov = {buf, sizeof(buf)}; + struct nlmsghdr *h; char *mac = NULL; - struct msghdr msg = { - .msg_name = &nladdr, - .msg_namelen = sizeof(nladdr), - .msg_iov = &iov, - .msg_iovlen = 1, - }; - - do{ + struct msghdr msg = { + .msg_name = &nladdr, + .msg_namelen = sizeof(nladdr), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + + do + { ret = recvmsg(u->fd, &msg, 0); } while ((-1 == ret) && (EINTR == errno)); - - if (ret < 0) { - printf("recv msg error\n"); - return; - } - else if (0 == ret) { - return; - } - - h = (struct nlmsghdr *)buf; + + if (ret < 0) + { + printf("recv msg error\n"); + return; + } + else if (0 == ret) + { + return; + } + + h = (struct nlmsghdr *)buf; char *kmsg = (char *)NLMSG_DATA(h); struct af_msg_hdr *af_hdr = (struct af_msg_hdr *)kmsg; - if (af_hdr->magic != 0xa0b0c0d0){ + if (af_hdr->magic != 0xa0b0c0d0) + { printf("magic error %x\n", af_hdr->magic); - return; + return; } - if (af_hdr->len <= 0 || af_hdr->len >= MAX_OAF_NETLINK_MSG_LEN){ + if (af_hdr->len <= 0 || af_hdr->len >= MAX_OAF_NETLINK_MSG_LEN) + { printf("data len error\n"); return; } char *kdata = kmsg + sizeof(struct af_msg_hdr); - struct json_object *root = json_tokener_parse(kdata); - if (!root){ - printf("parse json failed:%s", kdata); - return; - } - - struct json_object *mac_obj = json_object_object_get(root,"mac"); - - if (!mac_obj){ - printf("parse mac obj failed\n"); - json_object_put(root); + struct json_object *root = json_tokener_parse(kdata); + if (!root) + { + printf("parse json failed:%s", kdata); return; } - - mac = json_object_get_string(mac_obj); - - dev_node_t *node = find_dev_node(mac); - - if (!node){ - node = add_dev_node(mac); - if (!node){ - printf("add dev node failed\n"); - json_object_put(root); - return; - } + + struct json_object *mac_obj = json_object_object_get(root, "mac"); + + if (!mac_obj) + { + printf("parse mac obj failed\n"); + json_object_put(root); + return; } - + + mac = json_object_get_string(mac_obj); + + dev_node_t *node = find_dev_node(mac); + + if (!node) + { + node = add_dev_node(mac); + if (!node) + { + printf("add dev node failed\n"); + json_object_put(root); + return; + } + } + struct json_object *ip_obj = json_object_object_get(root, "ip"); if (ip_obj) strncpy(node->ip, json_object_get_string(ip_obj), sizeof(node->ip)); struct json_object *visit_array = json_object_object_get(root, "visit_info"); - if (!visit_array){ - json_object_put(root); - return; - } - for (i = 0; i < json_object_array_length(visit_array); i++){ - struct json_object *visit_obj = json_object_array_get_idx(visit_array, i); - struct json_object *appid_obj = json_object_object_get(visit_obj, "appid"); + if (!visit_array) + { + json_object_put(root); + return; + } + for (i = 0; i < json_object_array_length(visit_array); i++) + { + struct json_object *visit_obj = json_object_array_get_idx(visit_array, i); + struct json_object *appid_obj = json_object_object_get(visit_obj, "appid"); struct json_object *action_obj = json_object_object_get(visit_obj, "latest_action"); - struct json_object *up_obj = json_object_object_get(visit_obj, "up_bytes"); + struct json_object *up_obj = json_object_object_get(visit_obj, "up_bytes"); struct json_object *down_obj = json_object_object_get(visit_obj, "down_bytes"); struct timeval cur_time; - + gettimeofday(&cur_time, NULL); int appid = json_object_get_int(appid_obj); int action = json_object_get_int(action_obj); - int type = appid / 1000; - int id = appid % 1000; - - node->stat[type - 1][id - 1].total_time += REPORT_INTERVAL_SECS; - - // node->stat[type - 1][id - 1].total_down_bytes += json_object_get_int(down_obj); - // node->stat[type - 1][id - 1].total_up_bytes += json_object_get_int(up_obj); + int type = appid / 1000; + int id = appid % 1000; - int hash = hash_appid(appid); - visit_info_t *head = node->visit_htable[hash]; - if (head && (cur_time.tv_sec - head->latest_time) < 300){ - printf("update visit info curtime=%d, last time=%d\n", cur_time.tv_sec, head->latest_time); - head->latest_time = cur_time.tv_sec; - } - else{ - visit_info_t *visit_node = (visit_info_t *)calloc(1, sizeof(visit_info_t)); - visit_node->action = action; - visit_node->appid = appid; - visit_node->latest_time = cur_time.tv_sec; - visit_node->first_time = cur_time.tv_sec - MIN_VISIT_TIME; - visit_node->next = NULL; - add_visit_info_node(&node->visit_htable[hash], visit_node); - //printf("add visit info curtime=%d\n", cur_time.tv_sec); - } - } - - json_object_put(root); + node->stat[type - 1][id - 1].total_time += REPORT_INTERVAL_SECS; + + // node->stat[type - 1][id - 1].total_down_bytes += json_object_get_int(down_obj); + // node->stat[type - 1][id - 1].total_up_bytes += json_object_get_int(up_obj); + + int hash = hash_appid(appid); + visit_info_t *head = node->visit_htable[hash]; + if (head && (cur_time.tv_sec - head->latest_time) < 300) + { + printf("update visit info curtime=%d, last time=%d\n", cur_time.tv_sec, head->latest_time); + head->latest_time = cur_time.tv_sec; + } + else + { + visit_info_t *visit_node = (visit_info_t *)calloc(1, sizeof(visit_info_t)); + visit_node->action = action; + visit_node->appid = appid; + visit_node->latest_time = cur_time.tv_sec; + visit_node->first_time = cur_time.tv_sec - MIN_VISIT_TIME; + visit_node->next = NULL; + add_visit_info_node(&node->visit_htable[hash], visit_node); + //printf("add visit info curtime=%d\n", cur_time.tv_sec); + } + } + + json_object_put(root); } #define MAX_NL_MSG_LEN 1024 -int send_msg_to_kernel(int fd, void *msg, int len){ - struct sockaddr_nl saddr, daddr; - memset(&daddr, 0, sizeof(daddr)); +int send_msg_to_kernel(int fd, void *msg, int len) +{ + struct sockaddr_nl saddr, daddr; + memset(&daddr, 0, sizeof(daddr)); daddr.nl_family = AF_NETLINK; - daddr.nl_pid = 0; // to kernel + daddr.nl_pid = 0; // to kernel daddr.nl_groups = 0; - int ret = 0; - struct nlmsghdr *nlh = NULL; - nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_NL_MSG_LEN)); + int ret = 0; + struct nlmsghdr *nlh = NULL; + nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_NL_MSG_LEN)); nlh->nlmsg_len = NLMSG_SPACE(MAX_NL_MSG_LEN); nlh->nlmsg_flags = 0; nlh->nlmsg_type = 0; nlh->nlmsg_seq = 0; - nlh->nlmsg_pid = DEFAULT_USR_NL_PID; + nlh->nlmsg_pid = DEFAULT_USR_NL_PID; - char msg_buf[MAX_NL_MSG_LEN] = {0}; - struct af_msg_hdr *hdr = (struct af_msg_hdr *)msg_buf; - hdr->magic = 0xa0b0c0d0; - hdr->len = len; - char *p_data = msg_buf + sizeof(struct af_msg_hdr); - memcpy(p_data, msg, len); + char msg_buf[MAX_NL_MSG_LEN] = {0}; + struct af_msg_hdr *hdr = (struct af_msg_hdr *)msg_buf; + hdr->magic = 0xa0b0c0d0; + hdr->len = len; + char *p_data = msg_buf + sizeof(struct af_msg_hdr); + memcpy(p_data, msg, len); - - // memset(nlh, 0, sizeof(struct nlmsghdr)); + // memset(nlh, 0, sizeof(struct nlmsghdr)); memcpy(NLMSG_DATA(nlh), msg_buf, len + sizeof(struct af_msg_hdr)); - + ret = sendto(fd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *)&daddr, sizeof(struct sockaddr_nl)); - if(!ret) + if (!ret) { perror("sendto error\n"); - return -1; + return -1; } - return 0; + return 0; } int appfilter_nl_init(void) { int fd; - struct sockaddr_nl nls; + struct sockaddr_nl nls; fd = socket(AF_NETLINK, SOCK_RAW, OAF_NETLINK_ID); - if(fd < 0) + if (fd < 0) { printf("Connect netlink %d failed %s", OAF_NETLINK_ID, strerror(errno)); - exit(1); - } + exit(1); + } memset(&nls, 0, sizeof(struct sockaddr_nl)); nls.nl_pid = DEFAULT_USR_NL_PID; nls.nl_groups = 0; nls.nl_family = AF_NETLINK; - if (bind(fd, (void *)&nls, sizeof(struct sockaddr_nl))) { + if (bind(fd, (void *)&nls, sizeof(struct sockaddr_nl))) + { printf("Bind failed %s\n", strerror(errno)); exit(1); - } - + } + return fd; } - diff --git a/open-app-filter/src/appfilter_netlink.h b/open-app-filter/src/appfilter_netlink.h index fbaf950..f88b128 100755 --- a/open-app-filter/src/appfilter_netlink.h +++ b/open-app-filter/src/appfilter_netlink.h @@ -1,23 +1,23 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #ifndef __APPFILTER_NETLINK_H__ #define __APPFILTER_NETLINK_H__ @@ -25,20 +25,23 @@ #define OAF_NETLINK_ID 29 #define MAX_OAF_NETLINK_MSG_LEN 1024 -struct af_msg_hdr{ +struct af_msg_hdr +{ int magic; int len; }; -enum E_MSG_TYPE{ - AF_MSG_INIT, - AF_MSG_MAX +enum E_MSG_TYPE +{ + AF_MSG_INIT, + AF_MSG_MAX }; -typedef struct af_msg{ - int action; - void *data; -}af_msg_t; +typedef struct af_msg +{ + int action; + void *data; +} af_msg_t; int appfilter_nl_init(void); void appfilter_nl_handler(struct uloop_fd *u, unsigned int ev); int send_msg_to_kernel(int fd, void *msg, int len); diff --git a/open-app-filter/src/appfilter_ubus.c b/open-app-filter/src/appfilter_ubus.c index ff0249d..971fab3 100755 --- a/open-app-filter/src/appfilter_ubus.c +++ b/open-app-filter/src/appfilter_ubus.c @@ -1,23 +1,23 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #include #include @@ -39,449 +39,484 @@ struct ubus_context *ubus_ctx = NULL; static struct blob_buf b; -extern char * format_time(int timetamp); +extern char *format_time(int timetamp); -void get_hostname_by_mac(char *mac, char *hostname){ - if (!mac || !hostname) - return; - FILE *fp = fopen("/tmp/dhcp.leases", "r"); - if (!fp){ - printf("open dhcp lease file....failed\n"); - return; - } - char line_buf[256] = {0}; - while(fgets(line_buf, sizeof(line_buf), fp)){ - char hostname_buf[128] = {0}; - char mac_buf[32] = {0}; - sscanf(line_buf, "%*s %s %*s %s", mac_buf, hostname_buf); - if (0 == strcmp(mac, mac_buf)){ - strcpy(hostname, hostname_buf); - } - } - fclose(fp); - -} - - -void ubus_dump_visit_list(struct blob_buf *b, char *mac){ - int i, j; - void *c, *array; - void *t; - void *s; - - array = blobmsg_open_array(b, "dev_list"); - - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ - dev_node_t *node = dev_hash_table[i]; - while(node){ - if (mac && strcmp(mac, node->mac)){ - node = node->next; - continue; - } - t = blobmsg_open_table(b, NULL); - blobmsg_add_string(b, "hostname", "unknown"); - blobmsg_add_string(b, "mac", node->mac); - blobmsg_add_string(b, "ip", node->ip); - void *visit_array; - - visit_array = blobmsg_open_array(b, "visit_info"); - for (j = 0; j < MAX_VISIT_HASH_SIZE; j++){ - visit_info_t *p_info = node->visit_htable[j]; - while(p_info){ - char *first_time_str = format_time(p_info->first_time); - char *latest_time_str = format_time(p_info->latest_time); - int total_time = p_info->latest_time - p_info->first_time; - s = blobmsg_open_table(b, NULL); - blobmsg_add_string(b, "appname", "unknown"); - blobmsg_add_u32(b, "appid", p_info->appid); - blobmsg_add_u32(b, "latest_action", p_info->action); - blobmsg_add_u32(b, "first_time", p_info->first_time); - blobmsg_add_u32(b, "latest_time", p_info->latest_time); - blobmsg_close_table(b, s); - if (first_time_str) - free(first_time_str); - if (latest_time_str) - free(latest_time_str); - p_info = p_info->next; - } - } - - blobmsg_close_array(b, visit_array); - blobmsg_close_table(b, t); - node = node->next; +void get_hostname_by_mac(char *mac, char *hostname) +{ + if (!mac || !hostname) + return; + FILE *fp = fopen("/tmp/dhcp.leases", "r"); + if (!fp) + { + printf("open dhcp lease file....failed\n"); + return; + } + char line_buf[256] = {0}; + while (fgets(line_buf, sizeof(line_buf), fp)) + { + char hostname_buf[128] = {0}; + char mac_buf[32] = {0}; + sscanf(line_buf, "%*s %s %*s %s", mac_buf, hostname_buf); + if (0 == strcmp(mac, mac_buf)) + { + strcpy(hostname, hostname_buf); } } - blobmsg_close_array(b, array); + fclose(fp); } - -void update_app_visit_time_list(char *mac, struct app_visit_stat_info *visit_info){ - int i, j, s; - int num = 0; - - dev_node_t *node = find_dev_node(mac); - if (!node){ - printf("not found mac:%s\n", mac); - return; - } - for (i = 0; i < MAX_APP_TYPE; i++){ - for (j = 0; j < MAX_APP_ID_NUM; j++){ - unsigned long long min = visit_info->visit_list[0].total_time; - int min_index = 0; - if (node->stat[i][j].total_time == 0) - continue; - if (num < MAX_APP_STAT_NUM){ - min_index = num; - } - else{ - for (s = 0; s < MAX_APP_STAT_NUM; s++){ - if (visit_info->visit_list[s].total_time < min){ - min_index = s; - break; - } - } - } - num++; - if (node->stat[i][j].total_time > visit_info->visit_list[min_index].total_time){ - visit_info->visit_list[min_index].total_time = node->stat[i][j].total_time; - visit_info->visit_list[min_index].app_id = (i + 1) * 1000 + j + 1; - } - } - } - if (num < MAX_APP_STAT_NUM) - visit_info->num = num; - else - visit_info->num = MAX_APP_STAT_NUM; -} - -void update_app_class_visit_time_list(char *mac, int *visit_time){ - int i, j, s; - int num = 0; - - dev_node_t *node = find_dev_node(mac); - if (!node){ - printf("not found mac:%s\n", mac); - return; - } - for (i = 0; i < MAX_APP_TYPE; i++){ - for (j = 0; j < MAX_APP_ID_NUM; j++){ - if (node->stat[i][j].total_time == 0) - continue; - visit_time[i] += node->stat[i][j].total_time; - } - } -} - -void ubus_get_dev_visit_time_info(char *mac, struct blob_buf *b){ +void ubus_dump_visit_list(struct blob_buf *b, char *mac) +{ int i, j; - void *c, *array; - void *t; - void *s; - struct app_visit_stat_info info; - memset((char *)&info, 0x0, sizeof(info)); - update_app_visit_time_list(mac, &info); + void *c, *array; + void *t; + void *s; + + array = blobmsg_open_array(b, "dev_list"); + + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { + dev_node_t *node = dev_hash_table[i]; + while (node) + { + if (mac && strcmp(mac, node->mac)) + { + node = node->next; + continue; + } + t = blobmsg_open_table(b, NULL); + blobmsg_add_string(b, "hostname", "unknown"); + blobmsg_add_string(b, "mac", node->mac); + blobmsg_add_string(b, "ip", node->ip); + void *visit_array; + + visit_array = blobmsg_open_array(b, "visit_info"); + for (j = 0; j < MAX_VISIT_HASH_SIZE; j++) + { + visit_info_t *p_info = node->visit_htable[j]; + while (p_info) + { + char *first_time_str = format_time(p_info->first_time); + char *latest_time_str = format_time(p_info->latest_time); + int total_time = p_info->latest_time - p_info->first_time; + s = blobmsg_open_table(b, NULL); + blobmsg_add_string(b, "appname", "unknown"); + blobmsg_add_u32(b, "appid", p_info->appid); + blobmsg_add_u32(b, "latest_action", p_info->action); + blobmsg_add_u32(b, "first_time", p_info->first_time); + blobmsg_add_u32(b, "latest_time", p_info->latest_time); + blobmsg_close_table(b, s); + if (first_time_str) + free(first_time_str); + if (latest_time_str) + free(latest_time_str); + p_info = p_info->next; + } + } + + blobmsg_close_array(b, visit_array); + blobmsg_close_table(b, t); + node = node->next; + } + } + blobmsg_close_array(b, array); } +void update_app_visit_time_list(char *mac, struct app_visit_stat_info *visit_info) +{ + int i, j, s; + int num = 0; + + dev_node_t *node = find_dev_node(mac); + if (!node) + { + printf("not found mac:%s\n", mac); + return; + } + for (i = 0; i < MAX_APP_TYPE; i++) + { + for (j = 0; j < MAX_APP_ID_NUM; j++) + { + unsigned long long min = visit_info->visit_list[0].total_time; + int min_index = 0; + if (node->stat[i][j].total_time == 0) + continue; + if (num < MAX_APP_STAT_NUM) + { + min_index = num; + } + else + { + for (s = 0; s < MAX_APP_STAT_NUM; s++) + { + if (visit_info->visit_list[s].total_time < min) + { + min_index = s; + break; + } + } + } + num++; + if (node->stat[i][j].total_time > visit_info->visit_list[min_index].total_time) + { + visit_info->visit_list[min_index].total_time = node->stat[i][j].total_time; + visit_info->visit_list[min_index].app_id = (i + 1) * 1000 + j + 1; + } + } + } + if (num < MAX_APP_STAT_NUM) + visit_info->num = num; + else + visit_info->num = MAX_APP_STAT_NUM; +} + +void update_app_class_visit_time_list(char *mac, int *visit_time) +{ + int i, j, s; + int num = 0; + + dev_node_t *node = find_dev_node(mac); + if (!node) + { + printf("not found mac:%s\n", mac); + return; + } + for (i = 0; i < MAX_APP_TYPE; i++) + { + for (j = 0; j < MAX_APP_ID_NUM; j++) + { + if (node->stat[i][j].total_time == 0) + continue; + visit_time[i] += node->stat[i][j].total_time; + } + } +} + +void ubus_get_dev_visit_time_info(char *mac, struct blob_buf *b) +{ + int i, j; + void *c, *array; + void *t; + void *s; + struct app_visit_stat_info info; + memset((char *)&info, 0x0, sizeof(info)); + update_app_visit_time_list(mac, &info); +} static int appfilter_handle_visit_list(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) { - int ret; - blob_buf_init(&b, 0); - char *msg_obj_str = blobmsg_format_json(msg, true); - if (!msg_obj_str){ - printf("format json failed\n"); - return 0; - } - - struct json_object *req_obj = json_tokener_parse(msg_obj_str); - struct json_object *mac_obj = json_object_object_get(req_obj, "mac"); - - if(!mac_obj){ - ubus_dump_visit_list(&b, NULL); - } - else - ubus_dump_visit_list(&b, json_object_get_string(mac_obj)); - ubus_send_reply(ctx, req, b.head); - return 0; + int ret; + blob_buf_init(&b, 0); + char *msg_obj_str = blobmsg_format_json(msg, true); + if (!msg_obj_str) + { + printf("format json failed\n"); + return 0; + } + + struct json_object *req_obj = json_tokener_parse(msg_obj_str); + struct json_object *mac_obj = json_object_object_get(req_obj, "mac"); + + if (!mac_obj) + { + ubus_dump_visit_list(&b, NULL); + } + else + ubus_dump_visit_list(&b, json_object_get_string(mac_obj)); + ubus_send_reply(ctx, req, b.head); + return 0; } +typedef struct app_visit_time_info +{ + int app_id; + unsigned long long total_time; +} app_visit_time_info_t; -typedef struct app_visit_time_info{ - int app_id; - unsigned long long total_time; -}app_visit_time_info_t; - -int visit_time_compare(const void *a, const void *b){ - app_visit_time_info_t *p1 = (app_visit_time_info_t *)a; - app_visit_time_info_t *p2 = (app_visit_time_info_t *)b; - return p1->total_time < p2->total_time ? 1: -1; +int visit_time_compare(const void *a, const void *b) +{ + app_visit_time_info_t *p1 = (app_visit_time_info_t *)a; + app_visit_time_info_t *p2 = (app_visit_time_info_t *)b; + return p1->total_time < p2->total_time ? 1 : -1; } #define MAX_STAT_APP_NUM 128 -void update_top5_app(dev_node_t *node, app_visit_time_info_t top5_app_list[]){ - int i, j; - //memset(app_array, 0x0, sizeof(int) *size); - app_visit_time_info_t app_visit_array[MAX_STAT_APP_NUM]; - memset(app_visit_array, 0x0, sizeof(app_visit_array)); - int app_visit_num = 0; +void update_top5_app(dev_node_t *node, app_visit_time_info_t top5_app_list[]) +{ + int i, j; + //memset(app_array, 0x0, sizeof(int) *size); + app_visit_time_info_t app_visit_array[MAX_STAT_APP_NUM]; + memset(app_visit_array, 0x0, sizeof(app_visit_array)); + int app_visit_num = 0; - for (i = 0; i < MAX_APP_TYPE; i++){ - for (j = 0; j < MAX_APP_ID_NUM; j++){ - if (node->stat[i][j].total_time == 0) - continue; - app_visit_array[app_visit_num].app_id = (i + 1) * 1000 + j + 1; - app_visit_array[app_visit_num].total_time = node->stat[i][j].total_time; - app_visit_num++; - } - } - + for (i = 0; i < MAX_APP_TYPE; i++) + { + for (j = 0; j < MAX_APP_ID_NUM; j++) + { + if (node->stat[i][j].total_time == 0) + continue; + app_visit_array[app_visit_num].app_id = (i + 1) * 1000 + j + 1; + app_visit_array[app_visit_num].total_time = node->stat[i][j].total_time; + app_visit_num++; + } + } - qsort((void *)app_visit_array, app_visit_num, sizeof(app_visit_time_info_t), visit_time_compare); - #if 0 - for (i = 0; i < app_visit_num; i++){ - printf("appid %d-----------total time %llu\n", app_visit_array[i].app_id, - app_visit_array[i].total_time); - } - #endif - for (i = 0; i < 5; i++){ - top5_app_list[i] = app_visit_array[i]; - //printf("appid %d-----------total time %llu\n", app_visit_array[i].app_id, - // app_visit_array[i].total_time); - } + qsort((void *)app_visit_array, app_visit_num, sizeof(app_visit_time_info_t), visit_time_compare); +#if 0 +for (i = 0; i < app_visit_num; i++){ +printf("appid %d-----------total time %llu\n", app_visit_array[i].app_id, +app_visit_array[i].total_time); +} +#endif + for (i = 0; i < 5; i++) + { + top5_app_list[i] = app_visit_array[i]; + //printf("appid %d-----------total time %llu\n", app_visit_array[i].app_id, + // app_visit_array[i].total_time); + } } static int appfilter_handle_dev_list(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) { - int i, j; - struct json_object * root_obj = json_object_new_object(); - - struct json_object * dev_array = json_object_new_array(); - int count = 0; - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ - - dev_node_t *node = dev_hash_table[i]; - while(node){ - if (node->online == 0){ - - node = node->next; - continue; - } - struct json_object * dev_obj = json_object_new_object(); - struct json_object * app_array = json_object_new_array(); - app_visit_time_info_t top5_app_list[5]; - memset(top5_app_list, 0x0, sizeof(top5_app_list)); - update_top5_app(node, top5_app_list); - - for (j = 0; j < 5; j++){ - if (top5_app_list[j].app_id == 0) - break; - struct json_object * app_obj = json_object_new_object(); - json_object_object_add(app_obj, "id", json_object_new_int(top5_app_list[j].app_id)); - json_object_object_add(app_obj, "name", json_object_new_string(get_app_name_by_id(top5_app_list[j].app_id))); - json_object_array_add(app_array, app_obj); - } - - json_object_object_add(dev_obj, "applist", app_array); - json_object_object_add(dev_obj, "mac", json_object_new_string(node->mac)); - char hostname[32] = {0}; - get_hostname_by_mac(node->mac, hostname); - json_object_object_add(dev_obj, "ip", json_object_new_string(node->ip)); - - json_object_object_add(dev_obj, "online", json_object_new_int(1)); - json_object_object_add(dev_obj, "hostname", json_object_new_string(hostname)); - json_object_object_add(dev_obj, "latest_app", json_object_new_string("test")); - json_object_array_add(dev_array, dev_obj); + int i, j; + struct json_object *root_obj = json_object_new_object(); - node = node->next; - count++; - if (count >= MAX_SUPPORT_DEV_NUM) - goto END; + struct json_object *dev_array = json_object_new_array(); + int count = 0; + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { + + dev_node_t *node = dev_hash_table[i]; + while (node) + { + if (node->online == 0) + { + + node = node->next; + continue; + } + struct json_object *dev_obj = json_object_new_object(); + struct json_object *app_array = json_object_new_array(); + app_visit_time_info_t top5_app_list[5]; + memset(top5_app_list, 0x0, sizeof(top5_app_list)); + update_top5_app(node, top5_app_list); + + for (j = 0; j < 5; j++) + { + if (top5_app_list[j].app_id == 0) + break; + struct json_object *app_obj = json_object_new_object(); + json_object_object_add(app_obj, "id", json_object_new_int(top5_app_list[j].app_id)); + json_object_object_add(app_obj, "name", json_object_new_string(get_app_name_by_id(top5_app_list[j].app_id))); + json_object_array_add(app_array, app_obj); + } + + json_object_object_add(dev_obj, "applist", app_array); + json_object_object_add(dev_obj, "mac", json_object_new_string(node->mac)); + char hostname[32] = {0}; + get_hostname_by_mac(node->mac, hostname); + json_object_object_add(dev_obj, "ip", json_object_new_string(node->ip)); + + json_object_object_add(dev_obj, "online", json_object_new_int(1)); + json_object_object_add(dev_obj, "hostname", json_object_new_string(hostname)); + json_object_object_add(dev_obj, "latest_app", json_object_new_string("test")); + json_object_array_add(dev_array, dev_obj); + + node = node->next; + count++; + if (count >= MAX_SUPPORT_DEV_NUM) + goto END; } } - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ - dev_node_t *node = dev_hash_table[i]; - while(node){ - if (node->online != 0){ - - node = node->next; - continue; - } - struct json_object * dev_obj = json_object_new_object(); - struct json_object * app_array = json_object_new_array(); - app_visit_time_info_t top5_app_list[5]; - memset(top5_app_list, 0x0, sizeof(top5_app_list)); - update_top5_app(node, top5_app_list); - - for (j = 0; j < 5; j++){ - if (top5_app_list[j].app_id == 0) - break; - struct json_object * app_obj = json_object_new_object(); - json_object_object_add(app_obj, "id", json_object_new_int(top5_app_list[j].app_id)); - json_object_object_add(app_obj, "name", json_object_new_string(get_app_name_by_id(top5_app_list[j].app_id))); - json_object_array_add(app_array, app_obj); - } - - json_object_object_add(dev_obj, "applist", app_array); - json_object_object_add(dev_obj, "mac", json_object_new_string(node->mac)); - char hostname[32] = {0}; - get_hostname_by_mac(node->mac, hostname); - json_object_object_add(dev_obj, "ip", json_object_new_string(node->ip)); - - json_object_object_add(dev_obj, "online", json_object_new_int(0)); - json_object_object_add(dev_obj, "hostname", json_object_new_string(hostname)); - json_object_object_add(dev_obj, "latest_app", json_object_new_string("test")); - json_object_array_add(dev_array, dev_obj); - node = node->next; - count++; - if (count >= MAX_SUPPORT_DEV_NUM) - goto END; - } - } - - -END: + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { + dev_node_t *node = dev_hash_table[i]; + while (node) + { + if (node->online != 0) + { - - json_object_object_add(root_obj, "devlist", dev_array); - blob_buf_init(&b, 0); - blobmsg_add_object(&b, root_obj); - ubus_send_reply(ctx, req, b.head); - json_object_put(root_obj); - return 0; + node = node->next; + continue; + } + struct json_object *dev_obj = json_object_new_object(); + struct json_object *app_array = json_object_new_array(); + app_visit_time_info_t top5_app_list[5]; + memset(top5_app_list, 0x0, sizeof(top5_app_list)); + update_top5_app(node, top5_app_list); + + for (j = 0; j < 5; j++) + { + if (top5_app_list[j].app_id == 0) + break; + struct json_object *app_obj = json_object_new_object(); + json_object_object_add(app_obj, "id", json_object_new_int(top5_app_list[j].app_id)); + json_object_object_add(app_obj, "name", json_object_new_string(get_app_name_by_id(top5_app_list[j].app_id))); + json_object_array_add(app_array, app_obj); + } + + json_object_object_add(dev_obj, "applist", app_array); + json_object_object_add(dev_obj, "mac", json_object_new_string(node->mac)); + char hostname[32] = {0}; + get_hostname_by_mac(node->mac, hostname); + json_object_object_add(dev_obj, "ip", json_object_new_string(node->ip)); + + json_object_object_add(dev_obj, "online", json_object_new_int(0)); + json_object_object_add(dev_obj, "hostname", json_object_new_string(hostname)); + json_object_object_add(dev_obj, "latest_app", json_object_new_string("test")); + json_object_array_add(dev_array, dev_obj); + node = node->next; + count++; + if (count >= MAX_SUPPORT_DEV_NUM) + goto END; + } + } + +END: + + json_object_object_add(root_obj, "devlist", dev_array); + blob_buf_init(&b, 0); + blobmsg_add_object(&b, root_obj); + ubus_send_reply(ctx, req, b.head); + json_object_put(root_obj); + return 0; } - - static int appfilter_handle_visit_time(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) { - int ret; - struct app_visit_stat_info info; - blob_buf_init(&b, 0); - memset((char *)&info, 0x0, sizeof(info)); - char *msg_obj_str = blobmsg_format_json(msg, true); - if (!msg_obj_str){ - printf("format json failed\n"); - return 0; - } - - struct json_object *req_obj = json_tokener_parse(msg_obj_str); - struct json_object *mac_obj = json_object_object_get(req_obj, "mac"); - if(!mac_obj){ - printf("mac is NULL\n"); - return 0; - } - update_app_visit_time_list(json_object_get_string(mac_obj), &info); + int ret; + struct app_visit_stat_info info; + blob_buf_init(&b, 0); + memset((char *)&info, 0x0, sizeof(info)); + char *msg_obj_str = blobmsg_format_json(msg, true); + if (!msg_obj_str) + { + printf("format json failed\n"); + return 0; + } - struct json_object *resp_obj = json_object_new_object(); - struct json_object *app_info_array = json_object_new_array(); - json_object_object_add(resp_obj,"app_list", app_info_array); - int i; - for (i = 0; i < info.num; i++){ - struct json_object *app_info_obj = json_object_new_object(); - json_object_object_add(app_info_obj, "app_id", - json_object_new_string(get_app_name_by_id(info.visit_list[i].app_id))); - json_object_object_add(app_info_obj, "visit_time", - json_object_new_int(info.visit_list[i].total_time)); - json_object_array_add(app_info_array, app_info_obj); - } - - blobmsg_add_object(&b, resp_obj); - ubus_send_reply(ctx, req, b.head); - json_object_put(resp_obj); - json_object_put(req_obj); - return 0; + struct json_object *req_obj = json_tokener_parse(msg_obj_str); + struct json_object *mac_obj = json_object_object_get(req_obj, "mac"); + if (!mac_obj) + { + printf("mac is NULL\n"); + return 0; + } + update_app_visit_time_list(json_object_get_string(mac_obj), &info); + + struct json_object *resp_obj = json_object_new_object(); + struct json_object *app_info_array = json_object_new_array(); + json_object_object_add(resp_obj, "app_list", app_info_array); + int i; + for (i = 0; i < info.num; i++) + { + struct json_object *app_info_obj = json_object_new_object(); + json_object_object_add(app_info_obj, "app_id", + json_object_new_string(get_app_name_by_id(info.visit_list[i].app_id))); + json_object_object_add(app_info_obj, "visit_time", + json_object_new_int(info.visit_list[i].total_time)); + json_object_array_add(app_info_array, app_info_obj); + } + + blobmsg_add_object(&b, resp_obj); + ubus_send_reply(ctx, req, b.head); + json_object_put(resp_obj); + json_object_put(req_obj); + return 0; } static int handle_app_class_visit_time(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) { - int ret; - int i; - blob_buf_init(&b, 0); - char *msg_obj_str = blobmsg_format_json(msg, true); - if (!msg_obj_str){ - printf("format json failed\n"); - return 0; - } + int ret; + int i; + blob_buf_init(&b, 0); + char *msg_obj_str = blobmsg_format_json(msg, true); + if (!msg_obj_str) + { + printf("format json failed\n"); + return 0; + } - struct json_object *req_obj = json_tokener_parse(msg_obj_str); - struct json_object *mac_obj = json_object_object_get(req_obj, "mac"); - if(!mac_obj){ - printf("mac is NULL\n"); - return 0; - } - int app_class_visit_time[MAX_APP_TYPE]; - memset(app_class_visit_time, 0x0, sizeof(app_class_visit_time)); - update_app_class_visit_time_list(json_object_get_string(mac_obj), app_class_visit_time); + struct json_object *req_obj = json_tokener_parse(msg_obj_str); + struct json_object *mac_obj = json_object_object_get(req_obj, "mac"); + if (!mac_obj) + { + printf("mac is NULL\n"); + return 0; + } + int app_class_visit_time[MAX_APP_TYPE]; + memset(app_class_visit_time, 0x0, sizeof(app_class_visit_time)); + update_app_class_visit_time_list(json_object_get_string(mac_obj), app_class_visit_time); - struct json_object *resp_obj = json_object_new_object(); - struct json_object *app_class_array = json_object_new_array(); - json_object_object_add(resp_obj,"class_list", app_class_array); - for (i = 0; i < MAX_APP_TYPE; i++){ - if (i >= g_cur_class_num) - break; - struct json_object *app_class_obj = json_object_new_object(); - json_object_object_add(app_class_obj, "type", json_object_new_int(i)); - json_object_object_add(app_class_obj, "name", json_object_new_string(CLASS_NAME_TABLE[i])); - json_object_object_add(app_class_obj, "visit_time", json_object_new_int(app_class_visit_time[i])); - json_object_array_add(app_class_array, app_class_obj); - } - - blobmsg_add_object(&b, resp_obj); - ubus_send_reply(ctx, req, b.head); - json_object_put(resp_obj); - json_object_put(req_obj); - return 0; + struct json_object *resp_obj = json_object_new_object(); + struct json_object *app_class_array = json_object_new_array(); + json_object_object_add(resp_obj, "class_list", app_class_array); + for (i = 0; i < MAX_APP_TYPE; i++) + { + if (i >= g_cur_class_num) + break; + struct json_object *app_class_obj = json_object_new_object(); + json_object_object_add(app_class_obj, "type", json_object_new_int(i)); + json_object_object_add(app_class_obj, "name", json_object_new_string(CLASS_NAME_TABLE[i])); + json_object_object_add(app_class_obj, "visit_time", json_object_new_int(app_class_visit_time[i])); + json_object_array_add(app_class_array, app_class_obj); + } + + blobmsg_add_object(&b, resp_obj); + ubus_send_reply(ctx, req, b.head); + json_object_put(resp_obj); + json_object_put(req_obj); + return 0; } - static const struct blobmsg_policy empty_policy[1] = { - //[DEV_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING }, + //[DEV_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING }, }; static struct ubus_method appfilter_object_methods[] = { - UBUS_METHOD("visit_list", appfilter_handle_visit_list, empty_policy), - UBUS_METHOD("dev_visit_time", appfilter_handle_visit_time, empty_policy), - UBUS_METHOD("app_class_visit_time", handle_app_class_visit_time, empty_policy), - UBUS_METHOD("dev_list", appfilter_handle_dev_list, empty_policy), + UBUS_METHOD("visit_list", appfilter_handle_visit_list, empty_policy), + UBUS_METHOD("dev_visit_time", appfilter_handle_visit_time, empty_policy), + UBUS_METHOD("app_class_visit_time", handle_app_class_visit_time, empty_policy), + UBUS_METHOD("dev_list", appfilter_handle_dev_list, empty_policy), }; static struct ubus_object_type main_object_type = - UBUS_OBJECT_TYPE("appfilter", appfilter_object_methods); + UBUS_OBJECT_TYPE("appfilter", appfilter_object_methods); static struct ubus_object main_object = { - .name = "appfilter", - .type = &main_object_type, - .methods = appfilter_object_methods, - .n_methods = ARRAY_SIZE(appfilter_object_methods), + .name = "appfilter", + .type = &main_object_type, + .methods = appfilter_object_methods, + .n_methods = ARRAY_SIZE(appfilter_object_methods), }; static void appfilter_add_object(struct ubus_object *obj) { - int ret = ubus_add_object(ubus_ctx, obj); + int ret = ubus_add_object(ubus_ctx, obj); - if (ret != 0) - fprintf(stderr, "Failed to publish object '%s': %s\n", obj->name, ubus_strerror(ret)); + if (ret != 0) + fprintf(stderr, "Failed to publish object '%s': %s\n", obj->name, ubus_strerror(ret)); } int appfilter_ubus_init(void) { - ubus_ctx = ubus_connect("/var/run/ubus.sock"); - if (!ubus_ctx) - return -EIO; + ubus_ctx = ubus_connect("/var/run/ubus.sock"); + if (!ubus_ctx) + return -EIO; - appfilter_add_object(&main_object); - ubus_add_uloop(ubus_ctx); - return 0; + appfilter_add_object(&main_object); + ubus_add_uloop(ubus_ctx); + return 0; } diff --git a/open-app-filter/src/appfilter_user.c b/open-app-filter/src/appfilter_user.c index b9a2301..55f6724 100755 --- a/open-app-filter/src/appfilter_user.c +++ b/open-app-filter/src/appfilter_user.c @@ -1,23 +1,23 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #include #include @@ -35,48 +35,56 @@ dev_node_t *dev_hash_table[MAX_DEV_NODE_HASH_SIZE]; int g_cur_user_num = 0; unsigned int hash_mac(unsigned char *mac) { - if (!mac) - return 0; - else - return mac[0] & (MAX_DEV_NODE_HASH_SIZE - 1); + if (!mac) + return 0; + else + return mac[0] & (MAX_DEV_NODE_HASH_SIZE - 1); } -int get_timestamp(void){ - struct timeval cur_time; - gettimeofday(&cur_time, NULL); - return cur_time.tv_sec; +int get_timestamp(void) +{ + struct timeval cur_time; + gettimeofday(&cur_time, NULL); + return cur_time.tv_sec; } -int hash_appid(int appid){ - return appid % (MAX_VISIT_HASH_SIZE - 1); +int hash_appid(int appid) +{ + return appid % (MAX_VISIT_HASH_SIZE - 1); } -void add_visit_info_node(visit_info_t **head, visit_info_t *node){ - if (*head == NULL){ - *head = node; - } - else{ - node->next = *head; - *head = node; - } +void add_visit_info_node(visit_info_t **head, visit_info_t *node) +{ + if (*head == NULL) + { + *head = node; + } + else + { + node->next = *head; + *head = node; + } } -void init_dev_node_htable(){ +void init_dev_node_htable() +{ int i; - for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++){ + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { dev_hash_table[i] = NULL; } } - - -dev_node_t *add_dev_node(char *mac){ +dev_node_t *add_dev_node(char *mac) +{ unsigned int hash = 0; - if (g_cur_user_num >= MAX_SUPPORT_USER_NUM){ - printf("error, user num reach max %d\n", g_cur_user_num); - return NULL; - } + if (g_cur_user_num >= MAX_SUPPORT_USER_NUM) + { + printf("error, user num reach max %d\n", g_cur_user_num); + return NULL; + } hash = hash_mac(mac); - if (hash >= MAX_DEV_NODE_HASH_SIZE){ + if (hash >= MAX_DEV_NODE_HASH_SIZE) + { printf("hash code error %d\n", hash); return NULL; } @@ -84,30 +92,35 @@ dev_node_t *add_dev_node(char *mac){ if (!node) return NULL; strncpy(node->mac, mac, sizeof(node->mac)); - node->online = 1; - node->online_time = get_timestamp(); + node->online = 1; + node->online_time = get_timestamp(); if (dev_hash_table[hash] == NULL) dev_hash_table[hash] = node; - else{ + else + { node->next = dev_hash_table[hash]; dev_hash_table[hash] = node; } - g_cur_user_num++; + g_cur_user_num++; printf("add mac:%s to htable[%d]....success\n", mac, hash); return node; } -dev_node_t *find_dev_node(char *mac){ +dev_node_t *find_dev_node(char *mac) +{ unsigned int hash = 0; dev_node_t *p = NULL; hash = hash_mac(mac); - if (hash >= MAX_DEV_NODE_HASH_SIZE){ + if (hash >= MAX_DEV_NODE_HASH_SIZE) + { printf("hash code error %d\n", hash); return NULL; } p = dev_hash_table[hash]; - while(p){ - if (0 == strncmp(p->mac, mac, sizeof(p->mac))){ + while (p) + { + if (0 == strncmp(p->mac, mac, sizeof(p->mac))) + { return p; } p = p->next; @@ -115,181 +128,224 @@ dev_node_t *find_dev_node(char *mac){ return NULL; } -void dev_foreach(void *arg, iter_func iter){ - int i, j; - dev_node_t *node = NULL; +void dev_foreach(void *arg, iter_func iter) +{ + int i, j; + dev_node_t *node = NULL; - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { dev_node_t *node = dev_hash_table[i]; - while(node){ + while (node) + { iter(arg, node); - node = node->next; - } + node = node->next; + } } } - -char * format_time(int timetamp){ - char time_buf[64] = {0}; - time_t seconds = timetamp; - struct tm *auth_tm = localtime(&seconds); - strftime(time_buf, sizeof(time_buf), "%Y %m %d %H:%M:%S", auth_tm); - return strdup(time_buf); +char *format_time(int timetamp) +{ + char time_buf[64] = {0}; + time_t seconds = timetamp; + struct tm *auth_tm = localtime(&seconds); + strftime(time_buf, sizeof(time_buf), "%Y %m %d %H:%M:%S", auth_tm); + return strdup(time_buf); } - -void update_dev_hostname(void){ +void update_dev_hostname(void) +{ char line_buf[256] = {0}; char hostname_buf[128] = {0}; char mac_buf[32] = {0}; - char ip_buf[32] = {0}; - + char ip_buf[32] = {0}; + FILE *fp = fopen("/tmp/dhcp.leases", "r"); - if (!fp){ - printf("open dhcp lease file....failed\n"); - return; - } - while(fgets(line_buf, sizeof(line_buf), fp)){ - if (strlen(line_buf) <= 16) - continue; + if (!fp) + { + printf("open dhcp lease file....failed\n"); + return; + } + while (fgets(line_buf, sizeof(line_buf), fp)) + { + if (strlen(line_buf) <= 16) + continue; sscanf(line_buf, "%*s %s %s %s", mac_buf, ip_buf, hostname_buf); - dev_node_t *node = find_dev_node(mac_buf); - if (!node) - continue; - if (strlen(hostname_buf) > 0){ - strncpy(node->hostname, hostname_buf, sizeof(node->hostname)); - } - } + dev_node_t *node = find_dev_node(mac_buf); + if (!node) + continue; + if (strlen(hostname_buf) > 0) + { + strncpy(node->hostname, hostname_buf, sizeof(node->hostname)); + } + } fclose(fp); } -void clean_dev_online_status(void){ - int i; - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ +void clean_dev_online_status(void) +{ + int i; + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { dev_node_t *node = dev_hash_table[i]; - while(node){ - node->online = 0; - node->offline_time = get_timestamp(); - node = node->next; - } + while (node) + { + node->online = 0; + node->offline_time = get_timestamp(); + node = node->next; + } } } /* - Id Mac Ip - 1 10:bf:48:37:0c:94 192.168.66.244 +Id Mac Ip +1 10:bf:48:37:0c:94 192.168.66.244 */ -void check_dev_expire(void){ +void check_dev_expire(void) +{ char line_buf[256] = {0}; char mac_buf[32] = {0}; char ip_buf[32] = {0}; - + FILE *fp = fopen("/proc/net/af_client", "r"); - if (!fp){ + if (!fp) + { printf("open dev file....failed\n"); return; } fgets(line_buf, sizeof(line_buf), fp); // title - while(fgets(line_buf, sizeof(line_buf), fp)){ + while (fgets(line_buf, sizeof(line_buf), fp)) + { sscanf(line_buf, "%*s %s %s", mac_buf, ip_buf); - if (strlen(mac_buf) < 17){ + if (strlen(mac_buf) < 17) + { printf("invalid mac:%s\n", mac_buf); continue; } dev_node_t *node = find_dev_node(mac_buf); - if (!node){ + if (!node) + { node = add_dev_node(mac_buf); if (!node) continue; + strncpy(node->ip, ip_buf, sizeof(node->ip)); } node->online = 1; } fclose(fp); } -void dump_dev_list(void){ +void dump_dev_list(void) +{ int i, j; - int count = 0; - clean_dev_online_status(); - update_dev_hostname(); - check_dev_expire(); - FILE *fp = fopen(OAF_DEV_LIST_FILE, "w"); - if (!fp){ - return; - } - - fprintf(fp, "%-4s %-20s %-20s %-32s %-8s\n", "Id", "Mac Addr", "Ip Addr", "Hostname", "Online"); - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ - dev_node_t *node = dev_hash_table[i]; - while(node){ - if (node->online != 0){ - if (strlen(node->hostname) == 0) - strcpy(node->hostname, "*"); - fprintf(fp, "%-4d %-20s %-20s %-32s %-8d\n", - i + 1, node->mac, node->ip, node->hostname, node->online); - count++; - } - if (count >= MAX_SUPPORT_DEV_NUM){ - goto EXIT; - } - node = node->next; - } + int count = 0; + char hostname_buf[MAX_HOSTNAME_SIZE] = {0}; + char ip_buf[MAX_IP_LEN] = {0}; + clean_dev_online_status(); + update_dev_hostname(); + check_dev_expire(); + FILE *fp = fopen(OAF_DEV_LIST_FILE, "w"); + if (!fp) + { + return; } - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ + fprintf(fp, "%-4s %-20s %-20s %-32s %-8s\n", "Id", "Mac Addr", "Ip Addr", "Hostname", "Online"); + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { dev_node_t *node = dev_hash_table[i]; - while(node){ - - if (node->online == 0){ - if (strlen(node->hostname) == 0) - strcpy(node->hostname, "*"); - fprintf(fp, "%-4d %-20s %-20s %-32s %-8d\n", - i + 1, node->mac, node->ip, node->hostname, node->online); - } - if (count >= MAX_SUPPORT_DEV_NUM) - goto EXIT; - node = node->next; - } + while (node) + { + if (node->online != 0) + { + if (strlen(node->hostname) == 0) + strcpy(hostname_buf, "*"); + else + strcpy(hostname_buf, node->hostname); + if (strlen(node->ip) == 0) + strcpy(ip_buf, "*"); + else + strcpy(ip_buf, node->ip); + fprintf(fp, "%-4d %-20s %-20s %-32s %-8d\n", + i + 1, node->mac, ip_buf, hostname_buf, node->online); + count++; + } + if (count >= MAX_SUPPORT_DEV_NUM) + { + goto EXIT; + } + node = node->next; + } } -EXIT: - fclose(fp); -} - -void dump_dev_visit_list(void){ - int i, j; - int count = 0; - FILE *fp = fopen(OAF_VISIT_LIST_FILE, "w"); - if (!fp){ - return; - } - - fprintf(fp, "%-4s %-20s %-20s %-8s %-32s %-32s %-32s\n", "Id", "Mac Addr", \ - "Ip Addr", "Appid", "First Time", "Latest Time", "Total Time(s)"); - for (i = 0;i < MAX_DEV_NODE_HASH_SIZE; i++){ + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { dev_node_t *node = dev_hash_table[i]; - while(node){ - for (j = 0; j < MAX_VISIT_HASH_SIZE; j++){ - visit_info_t *p_info = node->visit_htable[j]; - while(p_info){ - char *first_time_str = format_time(p_info->first_time); - char *latest_time_str = format_time(p_info->latest_time); - int total_time = p_info->latest_time - p_info->first_time; - fprintf(fp, "%-4d %-20s %-20s %-8d %-32s %-32s %-32d\n", - count, node->mac, node->ip, p_info->appid, first_time_str, - latest_time_str, total_time); - if (first_time_str) - free(first_time_str); - if (latest_time_str) - free(latest_time_str); - p_info = p_info->next; - count++; - if (count > 50) - goto EXIT; - } - } - node = node->next; + while (node) + { + if (node->online == 0) + { + if (strlen(node->hostname) == 0) + strcpy(hostname_buf, "*"); + else + strcpy(hostname_buf, node->hostname); + + if (strlen(node->ip) == 0) + strcpy(ip_buf, "*"); + else + strcpy(ip_buf, node->ip); + + fprintf(fp, "%-4d %-20s %-20s %-32s %-8d\n", + i + 1, node->mac, ip_buf, hostname_buf, node->online); + } + if (count >= MAX_SUPPORT_DEV_NUM) + goto EXIT; + node = node->next; } } EXIT: - fclose(fp); + fclose(fp); } +void dump_dev_visit_list(void) +{ + int i, j; + int count = 0; + FILE *fp = fopen(OAF_VISIT_LIST_FILE, "w"); + if (!fp) + { + return; + } + + fprintf(fp, "%-4s %-20s %-20s %-8s %-32s %-32s %-32s\n", "Id", "Mac Addr", + "Ip Addr", "Appid", "First Time", "Latest Time", "Total Time(s)"); + for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) + { + dev_node_t *node = dev_hash_table[i]; + while (node) + { + for (j = 0; j < MAX_VISIT_HASH_SIZE; j++) + { + visit_info_t *p_info = node->visit_htable[j]; + while (p_info) + { + char *first_time_str = format_time(p_info->first_time); + char *latest_time_str = format_time(p_info->latest_time); + int total_time = p_info->latest_time - p_info->first_time; + fprintf(fp, "%-4d %-20s %-20s %-8d %-32s %-32s %-32d\n", + count, node->mac, node->ip, p_info->appid, first_time_str, + latest_time_str, total_time); + if (first_time_str) + free(first_time_str); + if (latest_time_str) + free(latest_time_str); + p_info = p_info->next; + count++; + if (count > 50) + goto EXIT; + } + } + node = node->next; + } + } +EXIT: + fclose(fp); +} diff --git a/open-app-filter/src/appfilter_user.h b/open-app-filter/src/appfilter_user.h index 49a891c..0954b20 100755 --- a/open-app-filter/src/appfilter_user.h +++ b/open-app-filter/src/appfilter_user.h @@ -1,95 +1,100 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #ifndef __FILTER_USER_H__ #define __FILTER_USER_H__ -#define MAX_IP_LEN 32 -#define MAX_MAC_LEN 32 -#define MAX_VISIT_HASH_SIZE 64 -#define MAX_DEV_NODE_HASH_SIZE 64 -#define MAX_HOSTNAME_SIZE 64 -#define MAX_SUPPORT_USER_NUM 64 +#define MAX_IP_LEN 32 +#define MAX_MAC_LEN 32 +#define MAX_VISIT_HASH_SIZE 64 +#define MAX_DEV_NODE_HASH_SIZE 64 +#define MAX_HOSTNAME_SIZE 64 +#define MAX_SUPPORT_USER_NUM 64 #define OAF_VISIT_LIST_FILE "/tmp/visit_list" #define OAF_DEV_LIST_FILE "/tmp/dev_list" #define MIN_VISIT_TIME 5 // default 5s #define MAX_APP_STAT_NUM 8 #define MAX_VISITLIST_DUMP_NUM 16 -#define MAX_APP_TYPE 16 -#define MAX_APP_ID_NUM 128 +#define MAX_APP_TYPE 16 +#define MAX_APP_ID_NUM 128 #define MAX_SUPPORT_DEV_NUM 64 //extern dev_node_t *dev_hash_table[MAX_DEV_NODE_HASH_SIZE]; /* { - "mac": "10:bf:48:37:0c:94", - "ip": "192.168.100.244", - "app_num": 0, - "visit_info": [{ - "appid": 8002, - "latest_action": 1, - "latest_time": 1602604293, - "total_num": 4, - "drop_num": 4, - "history_info": [] - }] +"mac": "10:bf:48:37:0c:94", +"ip": "192.168.100.244", +"app_num": 0, +"visit_info": [{ +"appid": 8002, +"latest_action": 1, +"latest_time": 1602604293, +"total_num": 4, +"drop_num": 4, +"history_info": [] +}] } */ /* 单个访问记录结构 */ -typedef struct visit_info{ - int appid; - int first_time; - int latest_time; - int action; - struct visit_info *next; -}visit_info_t; +typedef struct visit_info +{ + int appid; + int first_time; + int latest_time; + int action; + struct visit_info *next; +} visit_info_t; /* 用于记录某个app总时间和总流量 */ -typedef struct visit_stat{ - unsigned long long total_time; - unsigned long long total_down_bytes; - unsigned long long total_up_bytes; -}visit_stat_t; +typedef struct visit_stat +{ + unsigned long long total_time; + unsigned long long total_down_bytes; + unsigned long long total_up_bytes; +} visit_stat_t; -typedef struct dev_node{ +typedef struct dev_node +{ char mac[MAX_MAC_LEN]; char ip[MAX_IP_LEN]; - char hostname[MAX_HOSTNAME_SIZE]; - int online; - int offline_time; - int online_time; - visit_info_t *visit_htable[MAX_VISIT_HASH_SIZE]; - visit_stat_t stat[MAX_APP_TYPE][MAX_APP_ID_NUM]; + char hostname[MAX_HOSTNAME_SIZE]; + int online; + int offline_time; + int online_time; + visit_info_t *visit_htable[MAX_VISIT_HASH_SIZE]; + visit_stat_t stat[MAX_APP_TYPE][MAX_APP_ID_NUM]; struct dev_node *next; -}dev_node_t; +} dev_node_t; -struct app_visit_info{ - int app_id; - char app_name[32]; - int total_time; +struct app_visit_info +{ + int app_id; + char app_name[32]; + int total_time; }; -struct app_visit_stat_info{ - int num; - struct app_visit_info visit_list[MAX_APP_STAT_NUM]; +struct app_visit_stat_info +{ + int num; + struct app_visit_info visit_list[MAX_APP_STAT_NUM]; }; typedef void (*iter_func)(void *arg, dev_node_t *dev); //todo:dev for each diff --git a/open-app-filter/src/main.c b/open-app-filter/src/main.c index 6cf1f1e..666dbd0 100755 --- a/open-app-filter/src/main.c +++ b/open-app-filter/src/main.c @@ -1,23 +1,23 @@ /* - Copyright (C) 2020 Derry +Copyright (C) 2020 Derry - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ #include #include @@ -30,82 +30,87 @@ #include "appfilter_ubus.h" #include "appfilter_config.h" #include -void check_appfilter_enable(void){ - int enable = 1; - struct tm *t; - time_t tt; - time(&tt); +void check_appfilter_enable(void) +{ + int enable = 1; + struct tm *t; + time_t tt; + time(&tt); enable = config_get_appfilter_enable(); if (0 == enable) goto EXIT; - af_ctl_time_t *af_t = load_appfilter_ctl_time_config(); - if (!af_t){ - enable = 0; - goto EXIT; - } + af_ctl_time_t *af_t = load_appfilter_ctl_time_config(); + if (!af_t) + { + enable = 0; + goto EXIT; + } - t = localtime(&tt); - if (af_t->days[t->tm_wday] != 1){ - enable = 0; - goto EXIT; - } - if (af_t->start.hour <= af_t->end.hour){ - int cur_mins = t->tm_hour * 60 + t->tm_min; - if ((af_t->start.hour * 60 + af_t->start.min > cur_mins ) - || (cur_mins > af_t->end.hour * 60 + af_t->end.min)){ - enable = 0; - } - } - else - enable = 0; + t = localtime(&tt); + if (af_t->days[t->tm_wday] != 1) + { + enable = 0; + goto EXIT; + } + if (af_t->start.hour <= af_t->end.hour) + { + int cur_mins = t->tm_hour * 60 + t->tm_min; + if ((af_t->start.hour * 60 + af_t->start.min > cur_mins) || (cur_mins > af_t->end.hour * 60 + af_t->end.min)) + { + enable = 0; + } + } + else + enable = 0; EXIT: - if (enable){ - system("echo 1 >/proc/sys/oaf/enable "); - } - else - system("echo 0 >/proc/sys/oaf/enable "); - free(af_t); + if (enable) + { + system("echo 1 >/proc/sys/oaf/enable "); + } + else + system("echo 0 >/proc/sys/oaf/enable "); + free(af_t); } -void dev_list_timeout_handler(struct uloop_timeout *t){ +void dev_list_timeout_handler(struct uloop_timeout *t) +{ dump_dev_list(); -// dump_dev_visit_list(); - check_appfilter_enable(); -//todo: dev list expire - uloop_timeout_set(t, 10000); + // dump_dev_visit_list(); + check_appfilter_enable(); + //todo: dev list expire + uloop_timeout_set(t, 10000); } -struct uloop_timeout dev_tm={ - .cb = dev_list_timeout_handler -}; +struct uloop_timeout dev_tm = { + .cb = dev_list_timeout_handler}; static struct uloop_fd appfilter_nl_fd = { - .cb = appfilter_nl_handler, + .cb = appfilter_nl_handler, }; int main(int argc, char **argv) { int ret = 0; - uloop_init(); + uloop_init(); printf("init appfilter\n"); init_dev_node_htable(); - init_app_name_table(); - init_app_class_name_table(); - if (appfilter_ubus_init() < 0) { - fprintf(stderr, "Failed to connect to ubus\n"); - return 1; - } + init_app_name_table(); + init_app_class_name_table(); + if (appfilter_ubus_init() < 0) + { + fprintf(stderr, "Failed to connect to ubus\n"); + return 1; + } appfilter_nl_fd.fd = appfilter_nl_init(); uloop_fd_add(&appfilter_nl_fd, ULOOP_READ); - af_msg_t msg; - msg.action = AF_MSG_INIT; - - send_msg_to_kernel(appfilter_nl_fd.fd, (void *)&msg, sizeof(msg)); - uloop_timeout_set(&dev_tm, 5000); - uloop_timeout_add(&dev_tm); - uloop_run(); - uloop_done(); - return 0; -} + af_msg_t msg; + msg.action = AF_MSG_INIT; + send_msg_to_kernel(appfilter_nl_fd.fd, (void *)&msg, sizeof(msg)); + uloop_timeout_set(&dev_tm, 5000); + uloop_timeout_add(&dev_tm); + uloop_run(); + uloop_done(); + return 0; +}