534 lines
12 KiB
C
534 lines
12 KiB
C
#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);
|
||
}
|
||
if(cmd){
|
||
free(cmd);
|
||
}
|
||
/*ÔËÐÐÅäÖÃÎļþ*/
|
||
//system("service isc-dhcp-server restart");
|
||
system("systemctl restart isc-dhcp-server.service");
|
||
return ret;
|
||
}
|
||
|
||
char *getfileall(char *fname)
|
||
{
|
||
if(NULL == fname){
|
||
return NULL;
|
||
}
|
||
FILE *fp;
|
||
char *str;
|
||
char txt[1000] = {0};
|
||
int filesize;
|
||
if ((fp=fopen(fname,"r"))==NULL){
|
||
printf("open file %s failed\n",fname);
|
||
return NULL;
|
||
}
|
||
|
||
fseek(fp,0,SEEK_END);
|
||
|
||
filesize = ftell(fp);
|
||
str=(char *)malloc(filesize);
|
||
if(!str){
|
||
fclose(fp);
|
||
return NULL;
|
||
}
|
||
memset(str, 0, filesize);
|
||
rewind(fp);
|
||
while((fgets(txt,1000,fp))!=NULL){
|
||
strcat(str,txt);
|
||
}
|
||
fclose(fp);
|
||
if(!strcmp(str, "")){
|
||
free(str);
|
||
str = NULL;
|
||
return NULL;
|
||
}
|
||
return str;
|
||
}
|
||
|
||
char *getfilefirstline(char *fname)
|
||
{
|
||
if(NULL == fname){
|
||
return NULL;
|
||
}
|
||
FILE *fp;
|
||
char *str;
|
||
char txt[1000] = {0};
|
||
int filesize;
|
||
if ((fp=fopen(fname,"r"))==NULL){
|
||
printf("open file %s failed\n",fname);
|
||
return NULL;
|
||
}
|
||
|
||
fseek(fp,0,SEEK_END);
|
||
|
||
filesize = ftell(fp);
|
||
str=(char *)malloc(filesize);
|
||
if(!str){
|
||
fclose(fp);
|
||
return NULL;
|
||
}
|
||
memset(str, 0, filesize);
|
||
|
||
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, "")){
|
||
free(str);
|
||
str = NULL;
|
||
return NULL;
|
||
}
|
||
return str;
|
||
}
|
||
|
||
char *getfileall_with_linefeed(char *fname)
|
||
{
|
||
if(NULL == fname){
|
||
return NULL;
|
||
}
|
||
FILE *fp;
|
||
char *str;
|
||
char *p;
|
||
char line[1000] = {0};
|
||
int filesize;
|
||
if ((fp=fopen(fname,"r"))==NULL){
|
||
printf("open file %s failed\n",fname);
|
||
return NULL;
|
||
}
|
||
|
||
fseek(fp,0,SEEK_END);
|
||
|
||
filesize = ftell(fp);
|
||
str=(char *)malloc(filesize+100);
|
||
if(!str){
|
||
fclose(fp);
|
||
return NULL;
|
||
}
|
||
memset(str, 0, filesize+100);
|
||
|
||
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, "")){
|
||
free(str);
|
||
str = NULL;
|
||
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] = {0};
|
||
regmatch_t pmatch[1] = {0};
|
||
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){
|
||
if(!fname || !str){
|
||
return FALSE;
|
||
}
|
||
//¶ÁÈ¡Îļþ
|
||
FILE *fp;
|
||
//char *name, *mac, *ip;
|
||
char line[1000] = {0};
|
||
if ((fp=fopen(fname,"r"))==NULL){
|
||
printf("open file %s failed\n",fname);
|
||
return FALSE;
|
||
}
|
||
fseek(fp,0,SEEK_END);
|
||
rewind(fp);
|
||
|
||
while((fgets(line,1000,fp))!=NULL){
|
||
char *p = strstr(line, str);
|
||
if(p){
|
||
fclose(fp);
|
||
return TRUE;
|
||
}
|
||
}
|
||
fclose(fp);
|
||
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];
|
||
rangeARR[len] = 0;
|
||
strcpy(rangeARR, range);
|
||
|
||
//1¡¢·Ö³öÁ½¸öip & ÅжÏÊÇip
|
||
struct in_addr low, high, subnetadd, maskaddr;
|
||
char *item = NULL;
|
||
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] = {0};
|
||
strcpy(lowARR, inet_ntoa(low));
|
||
char highARR[15] = {0};
|
||
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];
|
||
dnsARR[len] = 0;
|
||
strcpy(dnsARR, dns);
|
||
|
||
//²ð·ÖDNS²¢ÅжÏÊÇ·ñÊÇip
|
||
char *item = NULL;
|
||
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){
|
||
if(!lease){
|
||
return FALSE;
|
||
}
|
||
//ÊÇÊý×־ͿÉÒÔ
|
||
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 = NULL, *mask = NULL;
|
||
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);
|
||
if(!cmd){
|
||
return NULL;
|
||
}
|
||
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];
|
||
arr[len] = 0;
|
||
strcpy(arr, servers);
|
||
|
||
//²ð·Öservers²¢ÅжÏÊÇ·ñÊÇip
|
||
char *item = NULL;
|
||
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){
|
||
if(!segment || !mask){
|
||
return FALSE;
|
||
}
|
||
//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] = {0};
|
||
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;
|
||
}
|
||
|
||
char *wan_if_str(){
|
||
char ifname[MAX_IF_NUM][INTERFACE_NAMSIZ];
|
||
memset(ifname, 0, sizeof(ifname));
|
||
//printf("ifname size: %d\n", sizeof(ifname));
|
||
int wan_count = if_wan_get(ifname, MAX_IF_NUM);
|
||
char *wanif = (char *)malloc(sizeof(ifname)+wan_count+1);
|
||
memset(wanif, 0, sizeof(ifname)+wan_count+1);
|
||
//printf("wan get cnt %d\n", wan_count);
|
||
int i;
|
||
for(i = 0; i < wan_count; i++)
|
||
{
|
||
strcat(wanif, " ");
|
||
strcat(wanif, ifname[i]);
|
||
}
|
||
//free(ifname);
|
||
if(!strcmp(wanif, "")){
|
||
free(wanif);
|
||
wanif = NULL;
|
||
return NULL;
|
||
}
|
||
return wanif;
|
||
}
|