secgateway/Platform/user/configm/config-server/dhcp_config/dhcp_lib.c

526 lines
12 KiB
C
Raw Normal View History

#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);
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>*/
//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, "")){
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, "")){
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, "")){
return NULL;
}
return str;
}
int check_name(char *name){
if(NULL == name){
return FALSE;
}
//1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B><>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>
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<><32>Ψһ<CEA8><D2BB><EFBFBD><EFBFBD>add<64><64>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
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(&reg, pattern, cflags);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
if(status != 0) {
regerror(status, &reg, ebuf, sizeof(ebuf));
//fprintf(stderr, "regcomp fail: %s , pattern '%s' \n",ebuf, pattern);
goto failed;
}
status = regexec(&reg, mac, nmatch, pmatch,0);//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>ıȽ<C4B1>,
if(status != 0) {
regerror(status, &reg, ebuf, sizeof(ebuf));
//fprintf(stderr, "regexec fail: %s , mac:\"%s\" \n", ebuf, mac);
goto failed;
}
//printf("[%s] match success.\n", __FUNCTION__);
regfree(&reg);
return TRUE;
failed:
regfree(&reg);
return FALSE;
}
int file_consist_str(char *fname, char *str){
if(!fname || !str){
return FALSE;
}
//<2F><>ȡ<EFBFBD>ļ<EFBFBD>
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<><31><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD><EFBFBD><EFBFBD>ip & <20>ж<EFBFBD><D0B6><EFBFBD>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<><32><EFBFBD><EFBFBD>subnet<65><74>Χ<EFBFBD><CEA7>
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<><33><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>
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);
//<2F><><EFBFBD><EFBFBD>DNS<4E><53><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ip
char *item = NULL;
item = strtok(dnsARR, ",");
if(NULL == item){
return FALSE;
}
if(!check_ip(item)){
return FALSE;
}
item = strtok(NULL, ",");
//ֻ<><D6BB>һ<EFBFBD><D2BB>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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>־Ϳ<D6BE><CDBF><EFBFBD>
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);
//<2F><><EFBFBD><EFBFBD>servers<72><73><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>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<><31><EFBFBD><EFBFBD>ip<69><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>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){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32λ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
b += n[i] << (i * 8);
}
b = ~b + 1;
if((b & (b - 1)) == 0){ //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ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;
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, "")){
return NULL;
}
return wanif;
}