#include #include #include #include #include #include #include #include #include "rpc.h" #include "parsefile.h" #include "netconfig.h" static char *if_parse_name(char *name, char *p) { while (isspace(*p)) p++; while (*p) { if (isspace(*p)) break; if (*p == ':') { /* could be an alias */ char *dot = p, *dotname = name; *name++ = *p++; while (isdigit(*p)) *name++ = *p++; if (*p != ':') { /* it wasn't, backup */ p = dot; name = dotname; } if (*p == '\0') return NULL; p++; break; } *name++ = *p++; } *name++ = '\0'; return p; } int if_read_dev_file(struct ifreq *ifcfg, int max_port) { struct ifreq *ifreq = (struct ifreq *)ifcfg; char name[128] = {0}; char buf[512] = {0}; int i = 0; FILE *fh; fh = fopen(PROC_NET_DEV, "r"); if (!fh) { return 0; } fgets(buf, sizeof buf, fh); /* eat line */ fgets(buf, sizeof buf, fh); while (fgets(buf, sizeof buf, fh)) { if(i >= max_port){ break; } memset(name, 0, 128); if_parse_name(name, buf); if(strlen(name) != 0){ strncpy(ifreq[i].ifr_name, name, sizeof(ifreq[i].ifr_name)); i++; } } fclose(fh); return i; } int if_read_conf_file(struct ifreq *ifcfg, int max_port) { struct ifreq *ifreq = (struct ifreq *)ifcfg; char name[INTERFACE_NAMSIZ] = {0}; char buf[512] = {0}; char *p = NULL; int i = 0, j = 0; FILE *fh; fh = fopen(ETC_NETWORK_IFS, "r"); if (!fh) { return 0; } while (fgets(buf, sizeof(buf), fh)) { p = NULL; if(i >= max_port){ break; } if(p = strstr(buf, "iface")) { p += strlen("iface"); while (isspace(*p)){ p++; } j = 0; memset(name, 0, INTERFACE_NAMSIZ); while(!isspace(*p)){ name[j++] = *p++; if(j >= INTERFACE_NAMSIZ){ break; } } name[INTERFACE_NAMSIZ - 1] = '\0'; strncpy(ifreq[i].ifr_name, name, sizeof(ifreq[i].ifr_name)); i++; } } fclose(fh); return i; } 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; } /* 缓存字符串保存到配置文件中 */ int conf_file_write(char *conf_path, char *sum_buf) { FILE *fp; fp = fopen(conf_path,"w+"); if(fp == NULL) { rpc_log_error("OPEN CONFIG FALID\n"); return RET_ERR; } fseek(fp,0,SEEK_SET); fputs(sum_buf,fp); fclose(fp); return RET_OK; } /* 设置指定配置块中的配置 */ int conf_value_in_block_get(char *conf_path, char *start_str, char *end_str, char *conf_name, char *conf_buff) { char config_linebuf[IF_BUFF_LEN]; boolean next_flag = FALSE; char *start_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_SET); memset(config_linebuf, 0, sizeof(config_linebuf)); while(fgets(config_linebuf, IF_BUFF_LEN, f) != NULL) { /* 该做的事情已经做完 */ if(next_flag == TRUE) { break; } /* 判断是否是空行 */ if(strlen(config_linebuf) < 3) { goto next_while; } /* 没有找到配置块,则继续循环 */ if(start_line == NULL) { start_line = strstr(config_linebuf, start_str); goto next_while; } /* 配置块结束 */ if(strstr(config_linebuf, end_str)) { break; } if(strstr(config_linebuf, conf_name)) { next_flag = TRUE; strncpy(conf_buff, config_linebuf, IF_BUFF_LEN); break; } next_while: if(fgetc(f)==EOF) { break; } fseek(f,-1,SEEK_CUR); memset(config_linebuf, 0, sizeof(config_linebuf)); } fclose(f); if(next_flag == TRUE) { rpc_log_dbg("---get_buf---->%s<----------\n",conf_buff); return RET_OK; } return RET_NOTFOUND; } /* 设置指定配置块中的配置 */ int conf_value_in_block_exist(char *conf_path, char *conf_buff) { char config_linebuf[IF_BUFF_LEN]; boolean next_flag = FALSE; char *start_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_SET); memset(config_linebuf, 0, sizeof(config_linebuf)); while(fgets(config_linebuf, IF_BUFF_LEN, f) != NULL) { if(strstr(config_linebuf, conf_buff)) { next_flag = TRUE; break; } memset(config_linebuf, 0, sizeof(config_linebuf)); } fclose(f); if(next_flag == TRUE) { rpc_log_dbg("---get_buf---->%s<----------\n",conf_buff); return RET_OK; } return RET_NOTFOUND; } /* 设置指定配置块中的配置 */ int conf_value_in_block_set(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 ) { /* 整个配置块都没有 */ if(start_line == NULL) { return RET_NOTFOUND; } if(config_line == NULL) { strcat(sum_buf, conf_buff); } } 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_add(char *conf_path, char *start_str, char *end_str, char *conf_name, char *conf_buff) { char config_linebuf[IF_BUFF_LEN]; int configbuf_lenth = 0; 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); configbuf_lenth = strlen(start_str) + strlen(conf_buff) + 5; 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)); } /* 整个配置块都没有,则新创建该配置块 */ if( next_flag == FALSE ) { if(start_line == NULL) { strcat(sum_buf, start_str); strcat(sum_buf, "\n"); } if(config_line == NULL) { strcat(sum_buf, conf_buff); } } remove(conf_path); fclose(f); rpc_log_dbg("---sum_buf---->%s<----------\n",sum_buf); return conf_file_write(conf_path, sum_buf); } /* 删除指定配置块中的配置 */ int conf_value_in_block_del(char *conf_path, char *start_str, char *end_str, char *conf_buff) { char config_linebuf[IF_BUFF_LEN]; int configbuf_lenth = strlen(conf_buff) + 5; long congig_lenth = 0; boolean next_flag = FALSE; char *start_line = NULL; FILE *f = fopen(conf_path, "r+"); if(f == NULL) { printf("OPEN CONFIG FALID\n"); return RET_ERR; } fseek(f, 0, SEEK_END); congig_lenth = ftell(f); char sum_buf[congig_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)) { strcat(sum_buf, config_linebuf); next_flag = TRUE; goto next_while; } /* 找到配置行 */ if(strstr(config_linebuf, conf_buff)) { next_flag = TRUE; } else { strcat(sum_buf, config_linebuf); } next_while: if(fgetc(f)==EOF) { break; } fseek(f,-1,SEEK_CUR); memset(config_linebuf, 0, sizeof(config_linebuf)); } remove(conf_path); fclose(f); rpc_log_dbg("---sum_buf---->%s<----------\n",sum_buf); return conf_file_write(conf_path, sum_buf); } /* 设置指定配置块中的配置 */ int conf_value_block_add(char *conf_path, char *conf_buff) { char config_linebuf[IF_BUFF_LEN]; int configbuf_lenth = strlen(conf_buff) + 5; long config_lenth = 0; boolean next_flag = FALSE; 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(strstr(config_linebuf, conf_buff)) { next_flag = TRUE; strcat(sum_buf, config_linebuf); break; } 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); rpc_log_dbg("---sum_buf---->%s<----------\n",sum_buf); /* 整个配置块都没有,则新创建该配置块 */ if( next_flag == FALSE ) { strcat(sum_buf, conf_buff); strcat(sum_buf, "\n"); remove(conf_path); return conf_file_write(conf_path, sum_buf); } return RET_EXIST; } int conf_value_block_del(char *conf_path, char *start_str, char *end_str) { char config_linebuf[IF_BUFF_LEN]; long congig_lenth = 0; boolean next_flag = FALSE; char *start_line = NULL; FILE *f = fopen(conf_path, "r+"); if(f == NULL) { printf("OPEN CONFIG FALID\n"); return RET_ERR; } fseek(f, 0, SEEK_END); congig_lenth = ftell(f); char sum_buf[congig_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); if(start_line == NULL) { strcat(sum_buf, config_linebuf); } goto next_while; } /* 已经到了end, 删除结束*/ if(strstr(config_linebuf, end_str)) { strcat(sum_buf, config_linebuf); next_flag = TRUE; goto next_while; } if(next_flag == TRUE) { strcat(sum_buf, config_linebuf); } next_while: if(fgetc(f)==EOF) { break; } fseek(f,-1,SEEK_CUR); memset(config_linebuf, 0, sizeof(config_linebuf)); } remove(conf_path); fclose(f); rpc_log_dbg("---sum_buf---->%s<----------\n",sum_buf); return conf_file_write(conf_path, sum_buf); } /* 增加接口配置块 */ ret_code if_conf_file_add(char *if_name) { char auto_str[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); return conf_value_block_add(ETC_NETWORK_IFS, auto_str); } /* 删除整个接口配置块 */ ret_code if_conf_file_del(char *if_name) { char auto_str[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); return conf_value_block_del(ETC_NETWORK_IFS, auto_str, "auto"); } /* 设置接口中的配置 */ 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); return conf_value_in_block_set(ETC_NETWORK_IFS, auto_str, "auto", conf_name, 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); return conf_value_in_block_get(ETC_NETWORK_IFS, auto_str, "auto", conf_name, conf_buff); } /* *添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加) * *输入参数:1,接口名 2,匹配标记 3,替换或添加的内容 * */ void ip_conf_file_set(char *if_name, char *conf_name, char *conf_buff) { char auto_str[IF_BUFF_LEN] = {0}; char iface_str[IF_BUFF_LEN] = {0}; char static_name[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); sprintf(iface_str, "iface %s inet", if_name); sprintf(static_name, "iface %s inet static\n", if_name); conf_value_in_block_set_add(ETC_NETWORK_IFS, auto_str, "auto", iface_str, static_name); conf_value_in_block_set_add(ETC_NETWORK_IFS, auto_str, "auto", conf_name, conf_buff); return; } /* *删除配置文件内容 * *输入参数:1,匹配标记 * */ void ip_conf_file_del(char *if_name, char *conf_buff) { char auto_str[IF_BUFF_LEN] = {0}; sprintf(auto_str, "auto %s", if_name); conf_value_in_block_del(ETC_NETWORK_IFS, auto_str, "auto", conf_buff); return; } /* 获取接口中的配置 */ ret_code if_default_role_get(char *if_name, char *conf_buff) { if(strcmp(if_name, "eth1") == 0 ||strcmp(if_name, "eth2") == 0) { strncpy(conf_buff, "wan", IF_BUFF_LEN); return RET_OK; } else if(strcmp(if_name, "eth3") == 0 ||strcmp(if_name, "eth4") == 0 || strcmp(if_name, "eth5") == 0) { strncpy(conf_buff, "wan", IF_BUFF_LEN); return RET_OK; } return RET_NOTFOUND; } /* 获取接口中的配置 */ ret_code if_role_file_get(char *if_name, char *conf_buff) { char start_str[IF_BUFF_LEN] = {0}; char *p; sprintf(start_str, "interface %s", if_name); if(conf_value_in_block_get(ETC_PRODUCT, start_str, "interface", "role", conf_buff) == RET_OK) { p = conf_buff + strlen("role"); while(*p != '\0' && isspace(*p)) { p++; } if(*p != '\0') { strncpy(conf_buff, p, IF_BUFF_LEN); return RET_OK; } } else { return if_default_role_get(if_name, conf_buff); } return RET_NOTFOUND; }