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

474 lines
11 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);
}
/*运行配置文件*/
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(&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){
//读取文件
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;
}