OCT 1. 删除OpenDHCP服务ini配置文件

2. 增加 DHCP 主、从服务器配置文件自动加载配置项功能
3. 增加 DHCP 地址池配置启动自动加载配置项功能
This commit is contained in:
huangxin 2022-12-08 15:12:23 +08:00
parent 00da37446d
commit b6c91279a5
6 changed files with 165 additions and 105 deletions

View File

@ -4,7 +4,7 @@
# own values below if you need change settings.
[LISTEN_ON]
#[LISTEN_ON]
# Specify the Interfaces you would like Server to listen
# if you have more than one NIC card on your server
# always specify which cards will listen DHCP/DNS requests
@ -16,16 +16,16 @@
# 192.168.100.1
[LOGGING]
#[LOGGING]
# LogLevel can be set as None, Errors or All
# It is advisable to keep logging to Normal, Normal include errors
# and DHCP renewal messages. Normal is defaul logging also.
;LogLevel=None
;LogLevel=Normal
LogLevel=All
#LogLevel=All
[REPLICATION_SERVERS]
#[REPLICATION_SERVERS]
# You can have 2 instances of Open DHCP Servers in a network. Open DHCP Server
# will send replication inform messages to other instance of Open DHCP
# server and leases will be replicated. The IP address alloted by one server
@ -35,11 +35,11 @@ LogLevel=All
# Make sure that Primary & Secondary Server entries are identical on both
# servers. You may copy the entire ini file on both servers and change the
# LISTEN_ON on individual servers, if needed.
;Primary=192.168.0.253
;Secondary=192.168.0.254
#Primary=192.168.30.1
#Secondary=192.168.30.3
[HTTP_INTERFACE]
#[HTTP_INTERFACE]
# This is http inerface for viewing lease status,
# Default is 127.0.0.1:6789
# You can change it here to any network interface.
@ -107,30 +107,30 @@ LogLevel=All
# with relay Agent IP. If not relay agent IP is sent, Listening Interface's IP
# will be matched. You can also override the Target Relay Agent using TargetRelayAgent option.
[RANGE_SET]
#[RANGE_SET]
# This is first and simple DHCP range section example,
# This example may be good enough for simple/home use.
# If you need range filters, look at example below
DHCPRange=192.168.30.110-192.168.30.120
#DHCPRange=192.168.30.110-192.168.30.120
;DHCPRange=192.168.5.1-192.168.5.254
# Following are range specific DHCP options.
# You can copy more options names from [GLOBAL_OPTIONS]
SubnetMask=255.255.255.0
DomainServer=114.114.114.114,8.8.8.8
#SubnetMask=255.255.255.0
#DomainServer=114.114.114.114,8.8.8.8
#Router is default gateway
Router=192.168.30.1
#Router=192.168.30.1
# Lease Time can be different for this Range
;AddressTime=360
#AddressTime=450
[RANGE_SET]
DHCPRange=192.168.100.110-192.168.100.200
#[RANGE_SET]
#DHCPRange=192.168.100.110-192.168.100.200
;DHCPRange=192.168.5.1-192.168.5.254
# Following are range specific DHCP options.
# You can copy more options names from [GLOBAL_OPTIONS]
SubnetMask=255.255.255.0
DomainServer=114.114.114.114,8.8.8.8
#SubnetMask=255.255.255.0
#DomainServer=114.114.114.114,8.8.8.8
#Router is default gateway
Router=192.168.100.1
#Router=192.168.100.1
[RANGE_SET]
# This section is also simple [RANGE_SET] section
@ -149,7 +149,7 @@ Router=192.168.100.1
;51=11000
[RANGE_SET]
#[RANGE_SET]
# This is filtered [RANGE_SET] section.
# First eight entries in this example are filters.
# Currently only following types of filters are supported

View File

@ -91,22 +91,22 @@ application:
# DHCP Server Config
dhcp_server: {
listen_on = ["192.168.30.1", "192.168.100.1"];
listen_on = ["192.168.30.1"];
# 主备服务器设置
# replication = ["192.168.100.211", "192.168.100.215"];
replication = ["192.168.30.1", "192.168.30.2"];
range_set: (
{ dhcp_range = "192.168.30.110-192.168.30.120";
{ dhcp_range = "192.168.30.150-192.168.30.155";
subnet_mask = "255.255.255.0";
domain_server = "114.114.114.114,8.8.8.8";
gateway = "192.168.30.1";
lease_time = 360;
lease_time = 36000;
},
{ dhcp_range = "192.168.100.110-192.168.100.200";
subnet_mask = "255.255.255.0";
domain_server = "114.114.114.114,8.8.8.8";
gateway = "192.168.100.1";
lease_time = 360;
lease_time = 36000;
}
);
};

View File

@ -12,7 +12,7 @@ Restart=always
RestartSec=5
User=root
WorkingDirectory=/home/jw/vcpe/srcs
ExecStart=/usr/bin/env /home/jw/vcpe/srcs/vcpe_main dhcpd -m -n vxlan0 -i ./config/opendhcp.ini -c ./config/vcpe.cfg -d ./config/ -k pqwAQ81rxg70aoy3v+Jjrw==
ExecStart=/usr/bin/env /home/jw/vcpe/srcs/vcpe_main dhcpd -m -n vxlan0 -c ./config/vcpe.cfg -d ./config/ -k pqwAQ81rxg70aoy3v+Jjrw==
[Install]
WantedBy=multi-user.target

View File

@ -56,7 +56,6 @@ data71 lump;
bool kRunning = true;
dhcpMap dhcpCache;
char serviceName[] = "OpenDHCPServer";
int ERR_PARAM;
//char tempbuff[512] = "";
//char logBuff[256];
//char extbuff[256] = "";
@ -3027,7 +3026,7 @@ void lockOptions(FILE *f) {
}
}
void addDHCPRange(char *dp) {
int addDHCPRange(char *dp) {
char logBuff[256];
MYDWORD rs = 0;
@ -3053,8 +3052,7 @@ void addDHCPRange(char *dp) {
(range->rangeEnd >= rs && range->rangeEnd <= re)) {
sprintf(logBuff, "Warning: DHCP Range %s overlaps with another range, ignored", dp);
logDHCPMess(logBuff, 1);
ERR_PARAM = ERR_ITEM_EXISTS;
return;
return ERR_ITEM_EXISTS;
}
}
@ -3077,18 +3075,21 @@ void addDHCPRange(char *dp) {
sprintf(logBuff, "DHCP Ranges Load, Memory Allocation Error");
logDHCPMess(logBuff, 1);
ERR_PARAM = ERR_MALLOC_MEMORY;
return;
return ERR_MALLOC_MEMORY;
}
}
} else {
sprintf(logBuff, "Section [%s] Invalid DHCP range %s in ini file, ignored", RANGESET, dp);
logDHCPMess(logBuff, 1);
return ERR_INPUT_PARAMS;
}
} else {
sprintf(logBuff, "Section [%s] Invalid DHCP range %s in ini file, ignored", RANGESET, dp);
logDHCPMess(logBuff, 1);
return ERR_INPUT_PARAMS;
}
return ERR_SUCCESS;
}
void addVendClass(MYBYTE rangeSetInd, char *vendClass, MYBYTE vendClassSize) {
@ -3236,6 +3237,8 @@ void loadDHCP() {
cfig.mask = inet_addr("255.255.255.0");
}
opendhcp_add_ip_pool_set();
#if 0
for (MYBYTE i = 1; i <= MAX_RANGE_SETS; i++) {
if ((f = openSection(RANGESET, i))) {
MYBYTE m = cfig.rangeCount;
@ -3260,7 +3263,7 @@ void loadDHCP() {
break;
}
}
#endif
//printf("%s\n", IP2String(ipbuff, cfig.mask));
for (char rangeInd = 0; rangeInd < cfig.rangeCount; rangeInd++) {
@ -4337,9 +4340,9 @@ void *init(void *lparam) {
FILE *f = nullptr;
if ((f = openSection("LOGGING", 1))) {
cfig.dhcpLogLevel = 1;
cfig.dhcpLogLevel = 2;
tempbuff[0] = 0;
#if 0
while (readSection(raw, f)) {
mySplit(name, value, raw, '=');
@ -4361,6 +4364,7 @@ void *init(void *lparam) {
sprintf(tempbuff, "Section [LOGGING], Invalid Entry %s ignored", raw);
}
}
#endif
if (tempbuff[0]) {
logDHCPMess(logBuff, 1);
}
@ -4447,6 +4451,8 @@ void *init(void *lparam) {
getInterfaces(&newNetwork);
memcpy(cfig.oldservers, newNetwork.staticServers, (MAX_SERVERS * sizeof(MYDWORD)));
opendhcp_set_replication_svr();
#if 0
if ((f = openSection("REPLICATION_SERVERS", 1))) {
while (readSection(raw, f)) {
mySplit(name, value, raw, '=');
@ -4471,7 +4477,7 @@ void *init(void *lparam) {
}
}
}
#endif
if (!cfig.zoneServers[0] && cfig.zoneServers[1]) {
sprintf(logBuff, "Section [REPLICATION_SERVERS] Missing Primary Server");
logDHCPMess(logBuff, 1);
@ -5357,6 +5363,7 @@ void *logThread(void *lpParam) {
}
#endif
#if 0
void logDHCPMess(char *logBuff, MYBYTE logLevel) {
// if (verbatim)
// printf("%s\n", logBuff);
@ -5379,6 +5386,7 @@ void logDHCPMess(char *logBuff, MYBYTE logLevel) {
// pthread_attr_destroy(&attr);
// }
}
#endif
data7 *createCache(data71 *pLump) {
MYWORD dataSize = 70 + sizeof(data7) + strlen(pLump->mapname) + pLump->optionSize;

View File

@ -72,6 +72,21 @@ typedef struct in_pktinfo IN_PKTINFO;
#define STR2INT(val) ((int)strtol((val), nullptr, 10))
#define logDHCPMess(logBuff, logLevel) \
do { \
switch ((logLevel)) { \
case 2: \
dzlog_debug("%s\n", logBuff); \
break; \
case 0: \
dzlog_error("%s\n", logBuff); \
break; \
default: \
dzlog_info("%s\n", logBuff); \
break; \
} \
} while (0)
struct data7 //cache
{
char *mapname;
@ -573,7 +588,7 @@ MYDWORD sdmess(data9 *);
MYDWORD sendRepl(data9 *req);
MYDWORD *findServer(MYDWORD *, MYBYTE, MYDWORD);
int getIndex(char, MYDWORD);
void addDHCPRange(char *dp);
int addDHCPRange(char *dp);
void addVendClass(MYBYTE rangeSetInd, char *vendClass, MYBYTE vendClassSize);
void addUserClass(MYBYTE rangeSetInd, char *userClass, MYBYTE userClassSize);
void addMacRange(MYBYTE rangeSetInd, char *macRange);
@ -587,7 +602,6 @@ void getSecondary();
void *init(void *);
void lockOptions(FILE *);
void loadOptions(FILE *, const char *, data20 *);
void logDHCPMess(char *, MYBYTE);
void mySplit(char *, char *, const char *, char);
void *sendHTTP(void *lpParam);
void procHTTP(data19 *);
@ -609,6 +623,8 @@ MYWORD qLen(char *);
const char *getRequestMethod(const char *buffer);
void prepareUserHtmlRespStatus(data19 *req);
void opendhcp_init_http_server();
void opendhcp_set_replication_svr();
void opendhcp_add_ip_pool_set();
int opendhcp_add_listener();
void sendUserList(data19 *req, const char *pRequest, dhcpMap *dhcpCache, data2 *cfig, time_t t);
void sendAllLists(data19 *req, bool kRunning, dhcpMap *dhcpCache, data2 *cfig);

View File

@ -28,7 +28,6 @@ extern data2 cfig;
extern bool kRunning;
extern dhcpMap dhcpCache;
extern time_t t;
extern int ERR_PARAM;
static int dhcp_get_user_info(data19 *req, const char *pRequest) {
char logBuff[512];
@ -205,42 +204,55 @@ static int dhcp_get_all_user(data19 *req) {
} \
} while (0)
static void add_options(OBJ_DHCP_RNG pRange, data20 *optionData) {
static int dhcp_add_rangeset_to_options(POBJ_DHCP_RNG pRange) {
int ret;
char buff[1024];
MYBYTE hoption[256];
MYBYTE *dp = optionData->options;
MYBYTE *dp;
MYWORD buffSize = sizeof(dhcp_packet) - sizeof(dhcp_header);
char value[256] = {0};
MYBYTE *options = nullptr;
data20 optionData {};
if (!pRange) {
return -ERR_INPUT_PARAMS;
}
memset(&optionData, 0, sizeof(data20));
optionData.rangeSetInd = cfig.rangeCount;
cfig.rangeSet[cfig.rangeCount].active = true;
dp = optionData.options;
*dp = 0;
dp++;
//dhcp_range
addDHCPRange(pRange.rangAddr);
if(ERR_PARAM != ERR_SUCCESS){
return;
ret = addDHCPRange(pRange->rangAddr);
if (ret != ERR_SUCCESS) {
return ret;
}
if (strlen(pRange.subnet) != 0) {
strcpy(value, pRange.subnet);
if (strlen(pRange->subnet) != 0) {
strcpy(value, pRange->subnet);
VALUE_TO_DHCP_TLV(buff, value, DHCP_OPTION_NETMASK);
optionData->mask = (*((MYDWORD *)value));
optionData.mask = (*((MYDWORD *)value));
}
if (strlen(pRange.dnsSvr) != 0) {
strcpy(value, pRange.dnsSvr);
if (strlen(pRange->dnsSvr) != 0) {
strcpy(value, pRange->dnsSvr);
VALUE_TO_DHCP_TLV(buff, value, DHCP_OPTION_DNS);
}
if (strlen(pRange.gateway) != 0) {
strcpy(value, pRange.gateway);
if (strlen(pRange->gateway) != 0) {
strcpy(value, pRange->gateway);
VALUE_TO_DHCP_TLV(buff, value, DHCP_OPTION_ROUTER);
}
//lease
if (pRange.lease != 0) {
if (pRange->lease != 0) {
MYDWORD j;
j = pRange.lease;
j = pRange->lease;
if (buffSize > 6) {
*dp = DHCP_OPTION_IPADDRLEASE;
dp++;
@ -252,18 +264,32 @@ static void add_options(OBJ_DHCP_RNG pRange, data20 *optionData) {
*dp = DHCP_OPTION_END;
dp++;
optionData->optionSize = (dp - optionData->options);
optionData.optionSize = (dp - optionData.options);
if (optionData.optionSize > 3) {
options = (MYBYTE *)calloc(1, optionData.optionSize);
memcpy(options, optionData.options, optionData.optionSize);
}
cfig.dhcpRanges[cfig.rangeCount].rangeSetInd = optionData.rangeSetInd;
cfig.dhcpRanges[cfig.rangeCount].options = options;
cfig.dhcpRanges[cfig.rangeCount].mask = optionData.mask;
if (!cfig.dhcpRanges[cfig.rangeCount].mask) {
cfig.dhcpRanges[cfig.rangeCount].mask = cfig.mask;
}
cfig.rangeCount = (char)(cfig.rangeCount + 1);
return ERR_SUCCESS;
}
static int add_dhcpd_rangeset(data19 *req, const char *pRequest) {
char logBuff[512];
const char *pStrContent;
OBJ_DHCP_RNG pRange;
OBJ_DHCP_RNG range;
char *fp;
cJSON *pRspRoot;
cJSON *pExpandArray;
ERR_PARAM = ERR_SUCCESS;
dzlog_debug("Input: %s\n", pRequest);
if (pRequest == nullptr || strlen(pRequest) == 0) {
@ -305,6 +331,7 @@ static int add_dhcpd_rangeset(data19 *req, const char *pRequest) {
cJSON_AddItemToObject(pRspRoot, "rangeSet", pExpandArray);
for (int i = 0; i < cJSON_GetArraySize(prange_set); i++) {
int ret;
cJSON *pItem = cJSON_GetArrayItem(prange_set, i);
cJSON *pdhcp_range = cJSON_GetObjectItem(pItem, "dhcpRange");
cJSON *pEx_range = cJSON_CreateObject();
@ -320,54 +347,34 @@ static int add_dhcpd_rangeset(data19 *req, const char *pRequest) {
cJSON *pgateway = cJSON_GetObjectItem(pItem, "gateway");
cJSON *please_time = cJSON_GetObjectItem(pItem, "leaseTime");
memset(&pRange, 0, sizeof(OBJ_DHCP_RNG));
memset(&range, 0, sizeof(OBJ_DHCP_RNG));
strcpy(pRange.rangAddr, pdhcp_range->valuestring);
strcpy(range.rangAddr, pdhcp_range->valuestring);
if (psubnet_mask) {
strcpy(pRange.subnet, psubnet_mask->valuestring);
strcpy(range.subnet, psubnet_mask->valuestring);
}
if (pdomain_server) {
strcpy(pRange.dnsSvr, pdomain_server->valuestring);
strcpy(range.dnsSvr, pdomain_server->valuestring);
}
if (pgateway) {
strcpy(pRange.gateway, pgateway->valuestring);
strcpy(range.gateway, pgateway->valuestring);
}
if (please_time) {
pRange.lease = please_time->valueint;
range.lease = please_time->valueint;
}
//写入cfig
MYBYTE m = cfig.rangeCount;
data20 optionData {};
optionData.rangeSetInd = m;
MYBYTE *options = nullptr;
cfig.rangeSet[optionData.rangeSetInd].active = true;
add_options(pRange, &optionData);
if(ERR_PARAM != ERR_SUCCESS){
cJSON_AddNumberToObject(pEx_range, "status", ERR_PARAM);
cJSON_AddStringToObject(pEx_range, "message", getErrorEnumDesc(ERR_PARAM));
ret = dhcp_add_rangeset_to_options(&range);
if (ret != ERR_SUCCESS) {
cJSON_AddNumberToObject(pEx_range, "status", ret);
cJSON_AddStringToObject(pEx_range, "message", getErrorEnumDesc(ret));
cJSON_AddItemToArray(pExpandArray, pEx_range);
break;
}
if (optionData.optionSize > 3) {
options = (MYBYTE *)calloc(1, optionData.optionSize);
memcpy(options, optionData.options, optionData.optionSize);
}
cfig.dhcpRanges[m].rangeSetInd = optionData.rangeSetInd;
cfig.dhcpRanges[m].options = options;
cfig.dhcpRanges[m].mask = optionData.mask;
if (!cfig.dhcpRanges[m].mask) {
cfig.dhcpRanges[m].mask = cfig.mask;
}
cfig.rangeCount = (char)(m + 1);
cJSON_AddNumberToObject(pEx_range, "status", ERR_SUCCESS);
cJSON_AddStringToObject(pEx_range, "message", getErrorEnumDesc(ERR_SUCCESS));
cJSON_AddItemToArray(pExpandArray, pEx_range);
@ -385,7 +392,7 @@ static int add_dhcpd_rangeset(data19 *req, const char *pRequest) {
return ERR_SUCCESS;
}
static int delete_dhcpd_rangeset(data19 *req, const char *pRequest){
static int delete_dhcpd_rangeset(data19 *req, const char *pRequest) {
char logBuff[512];
const char *pStrContent;
char *fp;
@ -425,18 +432,18 @@ static int delete_dhcpd_rangeset(data19 *req, const char *pRequest){
return ERR_MALLOC_MEMORY;
}
fp = req->dp;
pRspRoot = cJSON_CreateObject();
fp = req->dp;
pRspRoot = cJSON_CreateObject();
pdelArray = cJSON_CreateArray();
cJSON_AddItemToObject(pRspRoot, "rangeSet", pdelArray);
for(int i = 0; i < cJSON_GetArraySize(pdhcp_range); i++){
cJSON *pdelRange = cJSON_GetArrayItem(pdhcp_range, i);
for (int i = 0; i < cJSON_GetArraySize(pdhcp_range); i++) {
cJSON *pdelRange = cJSON_GetArrayItem(pdhcp_range, i);
cJSON *pdel_Item = cJSON_CreateObject();
char del_range[256];
bool deleted_flag = false;
if(!pdelRange){
if (!pdelRange) {
continue;
}
@ -444,42 +451,42 @@ static int delete_dhcpd_rangeset(data19 *req, const char *pRequest){
MYDWORD st_addr;
MYDWORD en_addr;
char start[128];
char end[128];
char start[128];
char end[128];
mySplit(start, end, del_range, '-');
st_addr = htonl(inet_addr(start));
en_addr = htonl(inet_addr(end));
cJSON_AddStringToObject(pdel_Item, "dhcpRange", pdelRange->valuestring);
if(st_addr && en_addr && st_addr <= en_addr){
MYBYTE m = 0;
if (st_addr && en_addr && st_addr <= en_addr) {
MYBYTE m = 0;
for (; m < cfig.rangeCount && cfig.dhcpRanges[m].rangeStart; m++) {
if(!deleted_flag){
if((st_addr == cfig.dhcpRanges[m].rangeStart) && (en_addr == cfig.dhcpRanges[m].rangeEnd)){
if (!deleted_flag) {
if ((st_addr == cfig.dhcpRanges[m].rangeStart) && (en_addr == cfig.dhcpRanges[m].rangeEnd)) {
deleted_flag = true;
if(m == cfig.rangeCount-1){
if (m == cfig.rangeCount - 1) {
memset(&cfig.dhcpRanges[m], 0, sizeof(struct data19));
}
continue;
}else if(st_addr == cfig.dhcpRanges[m].rangeStart||en_addr == cfig.dhcpRanges[m].rangeEnd){
} else if (st_addr == cfig.dhcpRanges[m].rangeStart || en_addr == cfig.dhcpRanges[m].rangeEnd) {
deleted_flag = false;
break;
}
}else{
memcpy(&(cfig.dhcpRanges[m-1]), &(cfig.dhcpRanges[m]), sizeof(struct data19));
} else {
memcpy(&(cfig.dhcpRanges[m - 1]), &(cfig.dhcpRanges[m]), sizeof(struct data19));
}
}
}else{
} else {
cJSON_AddNumberToObject(pdel_Item, "status", ERR_INPUT_PARAMS);
cJSON_AddStringToObject(pdel_Item, "message", getErrorEnumDesc(ERR_INPUT_PARAMS));
cJSON_AddItemToArray(pdelArray, pdel_Item);
break;
}
if(deleted_flag){
if (deleted_flag) {
cfig.rangeCount--;
}else{
} else {
cJSON_AddNumberToObject(pdel_Item, "status", ERR_INPUT_PARAMS);
cJSON_AddStringToObject(pdel_Item, "message", getErrorEnumDesc(ERR_INPUT_PARAMS));
cJSON_AddItemToArray(pdelArray, pdel_Item);
@ -496,7 +503,7 @@ static int delete_dhcpd_rangeset(data19 *req, const char *pRequest){
cJSON_Delete(pRoot);
req->bytes = (int)(fp - req->dp);
free((void*)pStrPro);
free((void *)pStrPro);
return ERR_SUCCESS;
}
@ -865,4 +872,33 @@ void opendhcp_init_http_server() {
hw_http_add_route("dhcp/delete/rangeset", opendhcp_http_delete_rangeset, nullptr);
added = TRUE;
}
}
/**
* DHCP
*/
void opendhcp_set_replication_svr() {
vector replication = config_get_dhcp_replication_svr();
if (replication && vect_size(replication) == 2) {
cfig.zoneServers[0] = inet_addr((const char *)vect_get_at(replication, 0));
cfig.zoneServers[1] = inet_addr((const char *)vect_get_at(replication, 1));
}
}
/**
* DHCP
*/
void opendhcp_add_ip_pool_set() {
vector pool = config_get_dhcp_server_range_set();
for (int i = 0; (pool && i < vect_size(pool)); i++) {
auto pRange = (POBJ_DHCP_RNG)vect_get_at(pool, i);
if (pRange) {
if (dhcp_add_rangeset_to_options(pRange) != ERR_SUCCESS) {
dzlog_error("Add rangeset(\"%s\") failed!", pRange->rangAddr);
}
}
}
}