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

534 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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(&reg, pattern, cflags);//±àÒëÕýÔòģʽ
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);//Ö´ÐÐÕýÔò±í´ïʽºÍ»º´æµÄ±È½Ï,
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;
}
//¶ÁÈ¡Îļþ
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;
}