#include "dhcp_lib.h" ret_code dhcp_config_init(void) { ret_code ret = RET_OK; ret = br_event_register(BR_DELETE_EVENT_PRE,del_interface_dhcp_cb); if(ret != RET_OK){ printf("register failed.\n"); return ret; } return ret; } int del_interface_dhcp_cb(BR_EVENT_TYPE event_type, br_event_t event_arg) { ret_code ret = RET_OK; char *segment = get_interface_subnet(event_arg.br_name); if(NULL == segment){ return ret; } char *mask = get_interface_mask(event_arg.br_name); if(NULL == mask){ return ret; } int len = 500; char *cmd = (char *)malloc(len + 1); if(NULL == cmd) { return RET_ERR; } memset(cmd, 0, len + 1); snprintf(cmd, len, "sed -r -i 's/%s //g' /etc/default/isc-dhcp-server", event_arg.br_name); system(cmd); memset(cmd, 0, len + 1); snprintf(cmd, len, "sed -r -i ':a;N;$!ba;s/[ \\t]*subnet[ \\t]+%s[ \\t]+netmask[ \\t]+%s[ \\t]*\\{[a-zA-Z#:; \\t\\n0-9\\.\\,\\-]+\\}/#/g' /etc/dhcp/dhcpd.conf", segment, mask); system(cmd); system("sed -r -i '/#/d' /etc/dhcp/dhcpd.conf"); if(segment){ free(segment); } if(mask){ free(mask); } /*运行配置文件*/ system("service isc-dhcp-server restart"); return ret; } char *getfileall(char *fname) { if(NULL == fname){ return NULL; } FILE *fp; char *str; char txt[1000]; int filesize; if ((fp=fopen(fname,"r"))==NULL){ printf("打开文件%s错误\n",fname); return NULL; } fseek(fp,0,SEEK_END); filesize = ftell(fp); str=(char *)malloc(filesize); str[0]=0; rewind(fp); while((fgets(txt,1000,fp))!=NULL){ strcat(str,txt); } fclose(fp); if(!strcmp(str, "")){ return NULL; } return str; } char *getfilefirstline(char *fname) { if(NULL == fname){ return NULL; } FILE *fp; char *str; char txt[1000]; int filesize; if ((fp=fopen(fname,"r"))==NULL){ printf("打开文件%s错误\n",fname); return NULL; } fseek(fp,0,SEEK_END); filesize = ftell(fp); str=(char *)malloc(filesize); str[0]=0; rewind(fp); while((fgets(txt,1000,fp))!=NULL){ int len = strlen(txt); if(txt[len-1] == '\n'){ txt[len-1] = '\0'; } strcat(str,txt); break; } fclose(fp); if(!strcmp(str, "")){ return NULL; } return str; } char *getfileall_with_linefeed(char *fname) { if(NULL == fname){ return NULL; } FILE *fp; char *str; char *p; char line[1000]; int filesize; if ((fp=fopen(fname,"r"))==NULL){ printf("打开文件%s错误\n",fname); return NULL; } fseek(fp,0,SEEK_END); filesize = ftell(fp); str=(char *)malloc(filesize+100); str[0]=0; rewind(fp); while((fgets(line,1000,fp))!=NULL){ int len = strlen(line); if(line[len-1] == '\n'){ line[len-1] = ' '; //printf("%s\n", line); p = line+len; stpcpy(p, "\\n"); //printf("%s\n", line); } strcat(str,line); } fclose(fp); //printf("%s\n", str); if(!strcmp(str, "")){ return NULL; } return str; } int check_name(char *name){ if(NULL == name){ return FALSE; } //1、数字+字母组成 int i=0; while(name[i] != '\0'){ if(((name[i]>='0') && (name[i]<='9')) || ((name[i]>='a') && (name[i]<='z')) || ((name[i]>='A') && (name[i]<='Z'))){ i++; continue; } return FALSE; } //2、唯一,在add的时候再判断 return TRUE; } int check_mac(char *mac){ if(NULL == mac){ return FALSE; } int status; const char * pattern = "^([A-Fa-f0-9]{2}[-,:]){5}[A-Fa-f0-9]{2}$"; const int cflags = REG_EXTENDED | REG_NEWLINE; char ebuf[128]; regmatch_t pmatch[1]; int nmatch = 10; regex_t reg; status = regcomp(®, pattern, cflags);//编译正则模式 if(status != 0) { regerror(status, ®, ebuf, sizeof(ebuf)); //fprintf(stderr, "regcomp fail: %s , pattern '%s' \n",ebuf, pattern); goto failed; } status = regexec(®, mac, nmatch, pmatch,0);//执行正则表达式和缓存的比较, if(status != 0) { regerror(status, ®, ebuf, sizeof(ebuf)); //fprintf(stderr, "regexec fail: %s , mac:\"%s\" \n", ebuf, mac); goto failed; } //printf("[%s] match success.\n", __FUNCTION__); regfree(®); return TRUE; failed: regfree(®); return FALSE; } int file_consist_str(char *fname, char *str){ //读取文件 FILE *fp; //char *name, *mac, *ip; char line[1000]; if ((fp=fopen(fname,"r"))==NULL){ printf("打开文件%s错误\n",fname); return FALSE; } fseek(fp,0,SEEK_END); rewind(fp); while((fgets(line,1000,fp))!=NULL){ char *p = strstr(line, str); if(p){ return TRUE; } } return FALSE; } int check_range(char *range, char *mask, char *subnet){ if((NULL==range) || (NULL==mask) || (NULL==subnet)){ return FALSE; } int len = strlen(range); char rangeARR[len+1]; strcpy(rangeARR, range); //1、分出两个ip & 判断是ip struct in_addr low, high, subnetadd, maskaddr; char *item; item = strtok(rangeARR, " "); int code, lowsub, highsub; if(NULL == item){ return FALSE; } code = inet_aton(item, &low); if(!(code)){ return FALSE; } item = strtok(NULL, " "); if(NULL == item){ return FALSE; } code = inet_aton(item, &high); if(!(code)){ return FALSE; } item = strtok(NULL, " "); if(NULL != item){ return FALSE; } // 2、在subnet范围内 inet_aton(subnet, &subnetadd); inet_aton(mask, &maskaddr); lowsub = low.s_addr & maskaddr.s_addr; if(lowsub != subnetadd.s_addr){ return FALSE; } highsub = high.s_addr & maskaddr.s_addr; if(highsub != subnetadd.s_addr){ return FALSE; } //3、后一个比前一个大 char lowARR[15]; strcpy(lowARR, inet_ntoa(low)); char highARR[15]; strcpy(highARR, inet_ntoa(high)); if(strcmp(lowARR, highARR) >= 0){ return FALSE; } return TRUE; } int check_dns(char *dns){ if(NULL == dns){ return FALSE; } int len = strlen(dns); char dnsARR[len+1]; strcpy(dnsARR, dns); //拆分DNS并判断是否是ip char *item; item = strtok(dnsARR, ","); if(NULL == item){ return FALSE; } if(!check_ip(item)){ return FALSE; } item = strtok(NULL, ","); //只有一个dns if(NULL == item){ return TRUE; } if(!check_ip(item)){ return FALSE; } item = strtok(NULL, ","); if(NULL != item){ return FALSE; } return TRUE; } int check_lease(char *lease){ //是数字就可以 int i=0; while(lease[i] != '\0'){ if((lease[i]>='0') && (lease[i]<='9')){ i++; continue; } return FALSE; } return TRUE; } int check_ip(char *ip){ if(NULL == ip){ return FALSE; } struct in_addr ipadd; //int s_addr; int code; code = inet_aton(ip, &ipadd); /* int s_addr; s_addr = htonl(ipadd.s_addr); printf("[test]ipadd.s_addr=%x, s_addr=%x\n", ipadd.s_addr, s_addr); ipadd.s_addr = s_addr;*/ if((1 == code)){ return TRUE; } return FALSE; } char *get_interface_subnet(char *interface) { if(NULL == interface){ return NULL; } struct in_addr ipadd, maskadd, subnet; char *ip, *mask; ip = get_interface_ip(interface); mask = get_interface_mask(interface); if(ip == NULL){ return NULL; } inet_aton(ip, &ipadd); if(mask == NULL){ return NULL; } inet_aton(mask, &maskadd); subnet.s_addr = ipadd.s_addr & maskadd.s_addr; if(ip != NULL){ free(ip); ip = NULL; } if(mask != NULL){ free(mask); mask = NULL; } //printf ("%s\n", inet_ntoa(subnet)); char *str = (char *)malloc(15); memset(str, 0, 15); strcpy(str, inet_ntoa(subnet)); return str; } char *get_interface_ip(char *interface) { if(NULL == interface){ return NULL; } char *cmd = (char *)malloc(101); if(!cmd){ return NULL; } memset(cmd, 0, 101); //snprintf(cmd, 100, "ifconfig %s | grep \"inet addr\" | awk '{ print $2}' | awk -F: '{print $2}' > /tmp/ip", interface); snprintf(cmd, 100, "ifconfig %s | grep \"inet\" | awk '{ print $2}' > /tmp/ip", interface); system(cmd); memset(cmd, 0, 101); free(cmd); return getfilefirstline("/tmp/ip"); } char *get_interface_mask(char *interface) { if(NULL == interface){ return NULL; } char *cmd = (char *)malloc(101); memset(cmd, 0, 101); //snprintf(cmd, 100, "ifconfig %s | grep \"Mask\" | awk '{ print $4}' | awk -F: '{print $2}' > /tmp/mask", interface); snprintf(cmd, 100, "ifconfig %s | grep \"netmask\" | awk '{ print $4}' > /tmp/mask", interface); system(cmd); memset(cmd, 0, 101); free(cmd); return getfilefirstline("/tmp/mask"); } int check_servers(char *servers){ if(NULL == servers){ return FALSE; } int len = strlen(servers); char arr[len+1]; strcpy(arr, servers); //拆分servers并判断是否是ip char *item; item = strtok(arr, " "); if(NULL == item){ return FALSE; } while(item != NULL){ if(!check_ip(item)){ return FALSE; } item = strtok(NULL, " "); } return TRUE; } int check_segment(char *segment, char *mask){ //1、是ip,是网段ip struct in_addr segmentadd, maskadd; if(check_ip(segment)){ inet_aton(segment, &segmentadd); inet_aton(mask, &maskadd); if((maskadd.s_addr & segmentadd.s_addr) == segmentadd.s_addr){ return TRUE; } } return FALSE; } int check_mask(char *mask) { if(check_ip(mask)) { unsigned int b = 0, i, n[4]; sscanf(mask, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]); for(i = 0; i < 4; ++i){ //将子网掩码存入32位无符号整型 b += n[i] << (i * 8); } b = ~b + 1; if((b & (b - 1)) == 0){ //判断是否为2^n return TRUE; } } return FALSE; }