diff --git a/Platform/user/configm/config-server/include/brconfig.h b/Platform/user/configm/config-server/include/brconfig.h index 3b8c4dd00..3b2c6cd70 100644 --- a/Platform/user/configm/config-server/include/brconfig.h +++ b/Platform/user/configm/config-server/include/brconfig.h @@ -11,8 +11,12 @@ typedef enum { BR_CREATE_EVENT = 1, BR_DELETE_EVENT, + BR_CREATE_EVENT_PRE, + BR_DELETE_EVENT_PRE, BR_IF_JOIN_EVENT, BR_IF_LEAVE_EVENT, + BR_IF_JOIN_EVENT_PRE, + BR_IF_LEAVE_EVENT_PRE, BR_EVENT_INVALID } BR_EVENT_TYPE; diff --git a/Platform/user/configm/config-server/include/parsefile.h b/Platform/user/configm/config-server/include/parsefile.h index caa1c5888..5bc6f51ce 100644 --- a/Platform/user/configm/config-server/include/parsefile.h +++ b/Platform/user/configm/config-server/include/parsefile.h @@ -4,7 +4,14 @@ #define IFCONFIG_PATH "/etc/network/interfaces" #define IF_BUFF_LEN 128 +ret_code if_conf_file_add(char *if_name); +ret_code if_conf_file_del(char *if_name); +ret_code if_conf_file_set(char *if_name, char *conf_name, char *conf_buff); +ret_code if_conf_file_get(char *if_name, char *conf_name, char *conf_buff); + void ip_conf_file_set(char *if_name, char *conf_name, char *conf_buff); void ip_conf_file_del(char *if_name, char *conf_buff); +ret_code del_sub_string(char *str_in,char *str_sub); + #endif diff --git a/Platform/user/configm/config-server/netconfig/bridge/brconfig.c b/Platform/user/configm/config-server/netconfig/bridge/brconfig.c index 8a54afff0..82f1c6066 100644 --- a/Platform/user/configm/config-server/netconfig/bridge/brconfig.c +++ b/Platform/user/configm/config-server/netconfig/bridge/brconfig.c @@ -11,6 +11,7 @@ #include "parsefile.h" #include "libbridge.h" #include "brnetlink.h" +#include "parsefile.h" #include "list.h" #ifndef DESC("事件通知函数") @@ -184,7 +185,54 @@ ret_code br_if_bridge_check(char *port_list, int cnt, uint config_type) return RET_OK; } -ret_code br_if_bridge_add(char * br_name, char *port_list, int cnt, int *sys_err) +ret_code br_save_file(BR_EVENT_TYPE event_type, + char *br_name, char *port_name) +{ + char *key_str = "bridge_ports"; + char config_str[IF_BUFF_LEN] = {0}; + ret_code ret; + + switch(event_type) + { + case BR_CREATE_EVENT: + if_conf_file_add(br_name); + break; + case BR_DELETE_EVENT: + if_conf_file_del(br_name) + break; + case BR_IF_JOIN_EVENT: + if(if_conf_file_get(br_name, key_str, config_str) == RET_OK) + { + if(strstr(config_str, port_name) != NULL) + { + return RET_OK; + } + strcat(config_str, " "); + strcat(config_str, port_name); + } + if_conf_file_set(br_name, key_str, config_str); + break; + case BR_IF_LEAVE_EVENT: + if(if_conf_file_get(br_name, key_str, config_str) == RET_OK) + { + if(strstr(config_str, port_name) != NULL) + { + del_sub_string(config_str, port_name); + rpc_log_info("BR_IF_LEAVE_EVENT: %s\n", config_str); + if_conf_file_set(br_name, key_str, config_str); + return RET_OK; + } + } + break; + default: + break; + } + + return RET_OK; +} + + +ret_code br_if_bridge_add(char *br_name, char *port_list, int cnt, int *sys_err) { ret_code ret = RET_OK; char *port_name; @@ -193,6 +241,7 @@ ret_code br_if_bridge_add(char * br_name, char *port_list, int cnt, int *sys_err for(i = 0; i < cnt) { + br_invoke_event(BR_IF_JOIN_EVENT_PRE, event_arg); port_name = port_list + INTERFACE_NAMSIZ * i; err = br_add_interface(br_name, port_name); if(err != 0) @@ -204,6 +253,8 @@ ret_code br_if_bridge_add(char * br_name, char *port_list, int cnt, int *sys_err br_event_t event_arg = {br_name, port_name}; br_invoke_event(BR_IF_JOIN_EVENT, event_arg); + + br_save_file(BR_IF_JOIN_EVENT, br_name, port_name); } return ret; @@ -218,6 +269,7 @@ ret_code br_if_bridge_del(char * br_name, char *port_list, int cnt, int *sys_err for(i = 0; i < cnt) { + br_invoke_event(BR_IF_LEAVE_EVENT_PRE, event_arg); port_name = port_list + INTERFACE_NAMSIZ * i; err = br_del_interface(br_name, port_name); if(err != 0) @@ -229,6 +281,8 @@ ret_code br_if_bridge_del(char * br_name, char *port_list, int cnt, int *sys_err br_event_t event_arg = {br_name, port_name}; br_invoke_event(BR_IF_LEAVE_EVENT, event_arg); + + br_save_file(BR_IF_LEAVE_EVENT, br_name, port_name); } return ret; @@ -244,10 +298,12 @@ int br_if_bridge_num(char *br_name) return cnt; } -ret_code br_bridge_add(char * br_name, int *sys_err) +ret_code br_bridge_add(char *br_name, int *sys_err) { br_event_t event_arg = {br_name, NULL}; int sys_ret = 0; + + br_invoke_event(BR_CREATE_EVENT_PRE, event_arg); sys_ret = br_add_bridge(br_name); *sys_err = sys_ret; @@ -258,7 +314,9 @@ ret_code br_bridge_add(char * br_name, int *sys_err) } br_invoke_event(BR_CREATE_EVENT, event_arg); - + + br_save_file(BR_CREATE_EVENT, br_name, NULL); + return RET_OK; } @@ -267,6 +325,8 @@ ret_code br_bridge_del(char * br_name, int *sys_err) br_event_t event_arg = {br_name, NULL}; int sys_ret = 0; + br_invoke_event(BR_DELETE_EVENT_PRE, event_arg); + sys_ret = br_del_bridge(br_name); *sys_err = sys_ret; @@ -276,9 +336,10 @@ ret_code br_bridge_del(char * br_name, int *sys_err) } br_invoke_event(BR_DELETE_EVENT, event_arg); - + + br_save_file(BR_DELETE_EVENT, br_name, NULL); + return RET_OK; - } #endif diff --git a/Platform/user/configm/config-server/netconfig/parsefile.c b/Platform/user/configm/config-server/netconfig/parsefile.c index 854bbbb26..8ff29a715 100644 --- a/Platform/user/configm/config-server/netconfig/parsefile.c +++ b/Platform/user/configm/config-server/netconfig/parsefile.c @@ -151,6 +151,116 @@ int conf_value_in_block_exist(char *conf_path, char *conf_buff) return RET_NOTFOUND; } +/* 设置指定配置块中的配置 */ +int conf_value_in_block_set_ex(char *conf_path, + char *start_str, char *end_str, + char *conf_name, char *conf_buff) +{ + char config_linebuf[IF_BUFF_LEN]; + int configbuf_lenth = strlen(conf_buff) + 5; + long config_lenth = 0; + boolean next_flag = FALSE; + char *start_line = NULL; + char *config_line = NULL; + FILE *f; + + f = fopen(conf_path,"r+"); + if(f == NULL) + { + rpc_log_error("OPEN CONFIG %s FALID\n", conf_path); + return RET_ERR; + } + + fseek(f, 0, SEEK_END); + + config_lenth = ftell(f); + + char sum_buf[config_lenth + configbuf_lenth]; + + memset(sum_buf, 0, sizeof(sum_buf)); + + fseek(f, 0, SEEK_SET); + + memset(config_linebuf, 0, sizeof(config_linebuf)); + + while(fgets(config_linebuf, IF_BUFF_LEN, f) != NULL) + { + /* 该做的事情已经做完 */ + if(next_flag == TRUE) + { + strcat(sum_buf, config_linebuf); + goto next_while; + } + + /* 判断是否是空行 */ + if(strlen(config_linebuf) < 3) + { + strcat(sum_buf, config_linebuf); + goto next_while; + } + + /* 没有找到配置块,则继续循环 */ + if(start_line == NULL) + { + start_line = strstr(config_linebuf, start_str); + strcat(sum_buf, config_linebuf); + goto next_while; + } + + /* 配置块结束 */ + if(strstr(config_linebuf, end_str)) + { + if(config_line == NULL) + { + strcat(sum_buf, conf_buff); + } + + strcat(sum_buf, config_linebuf); + next_flag = TRUE; + + goto next_while; + } + + if(config_line == NULL) + { + config_line = strstr(config_linebuf, conf_name); + + /* 找到配置行 */ + if(config_line) + { + next_flag = TRUE; + strcat(sum_buf, conf_buff); + goto next_while; + } + } + + strcat(sum_buf, config_linebuf); + +next_while: + if(fgetc(f)==EOF) + { + break; + } + + fseek(f,-1,SEEK_CUR); + + memset(config_linebuf, 0, sizeof(config_linebuf)); + } + + fclose(f); + + /* 整个配置块都没有,则新创建该配置块 */ + if( next_flag == FALSE ) + { + return RET_NOTFOUND; + } + + remove(conf_path); + + rpc_log_dbg("---sum_buf---->%s<----------\n",sum_buf); + + return conf_file_write(conf_path, sum_buf); +} /* 设置指定配置块中的配置 */ int conf_value_in_block_set(char *conf_path, @@ -530,51 +640,45 @@ int conf_value_block_del(char *conf_path, char *start_str, char *end_str) } /* 增加接口配置块 */ -void if_conf_file_add(char *if_name) +ret_code if_conf_file_add(char *if_name) { char auto_str[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); - conf_value_block_add(IFCONFIG_PATH, auto_str); - - return; + return conf_value_block_add(IFCONFIG_PATH, auto_str); } /* 删除整个接口配置块 */ -void if_conf_file_del(char *if_name) +ret_code if_conf_file_del(char *if_name) { char auto_str[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); - conf_value_block_del(IFCONFIG_PATH, auto_str, "auto"); - - return; + return conf_value_block_del(IFCONFIG_PATH, auto_str, "auto"); } /* 设置接口中的配置 */ -void if_conf_file_set(char *if_name, char *conf_name, char *conf_buff) +ret_code if_conf_file_set(char *if_name, char *conf_name, char *conf_buff) { char auto_str[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); - conf_value_in_block_set(IFCONFIG_PATH, auto_str, "auto", conf_name, conf_buff); - - return; + return conf_value_in_block_set_ex(IFCONFIG_PATH, auto_str, + "auto", conf_name, conf_buff); } /* 获取接口中的配置 */ -void if_conf_file_get(char *if_name, char *conf_name, char *conf_buff) +ret_code if_conf_file_get(char *if_name, char *conf_name, char *conf_buff) { char auto_str[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); - conf_value_in_block_get(IFCONFIG_PATH, auto_str, "auto", conf_name, conf_buff); - - return; + return conf_value_in_block_get(IFCONFIG_PATH, auto_str, + "auto", conf_name, conf_buff); } ret_code if_conf_file_exist(char *if_name, char *conf_buff) @@ -610,7 +714,6 @@ void ip_conf_file_set(char *if_name, char *conf_name, char *conf_buff) return; } - /* *删除配置文件内容 * @@ -628,3 +731,25 @@ void ip_conf_file_del(char *if_name, char *conf_buff) return; } +ret_code del_sub_string(char *str_in,char *str_sub) +{ + char* str_out = (char *)malloc(strlen(str_in) + 1); + char* p; + + if(str_out == NULL) + { + return RET_NULLP; + } + + while((p = strstr(str_in, str_sub)) != NULL) + { + *p = '\0'; + + strcpy(str_out, p + strlen(str_sub)); + strcat(str_in, str_out); + } + + return RET_OK; +} + +