mirror of
git://git.code.sf.net/p/dhcpd-pools/code
synced 2025-12-16 15:57:00 +00:00
add start, end and hostname printing support for xml and json
In short it gets these parameters and prints them in json and xml formats. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
parent
102d017ed5
commit
3d37ac0a2d
8 changed files with 92 additions and 4 deletions
1
THANKS
1
THANKS
|
|
@ -49,3 +49,4 @@ Mark Sangster
|
||||||
Brent Swingle
|
Brent Swingle
|
||||||
Mathieu Morier
|
Mathieu Morier
|
||||||
Jean Benoit
|
Jean Benoit
|
||||||
|
Belkacem Daheb
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,9 @@ enum prefix_t {
|
||||||
PREFIX_BINDING_STATE_ACTIVE,
|
PREFIX_BINDING_STATE_ACTIVE,
|
||||||
PREFIX_BINDING_STATE_BACKUP,
|
PREFIX_BINDING_STATE_BACKUP,
|
||||||
PREFIX_HARDWARE_ETHERNET,
|
PREFIX_HARDWARE_ETHERNET,
|
||||||
|
PREFIX_STARTS,
|
||||||
|
PREFIX_ENDS,
|
||||||
|
PREFIX_HOSTNAME,
|
||||||
NUM_OF_PREFIX
|
NUM_OF_PREFIX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -180,6 +183,9 @@ struct leases_t {
|
||||||
char *ethernet;
|
char *ethernet;
|
||||||
UT_hash_handle hh;
|
UT_hash_handle hh;
|
||||||
enum ltype type;
|
enum ltype type;
|
||||||
|
char *ends;
|
||||||
|
char *starts;
|
||||||
|
char *hostname;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \enum limbits
|
/*! \enum limbits
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ enum isc_conf_parser {
|
||||||
int parse_leases(struct conf_t *state)
|
int parse_leases(struct conf_t *state)
|
||||||
{
|
{
|
||||||
FILE *dhcpd_leases;
|
FILE *dhcpd_leases;
|
||||||
char *line, *ipstring, macstring[20], *stop;
|
char *line, *ipstring, macstring[20], *stop, endsstr[30], startsstr[30], hostnamestr[MAXLEN];
|
||||||
union ipaddr_t addr;
|
union ipaddr_t addr;
|
||||||
struct leases_t *lease;
|
struct leases_t *lease;
|
||||||
|
|
||||||
|
|
@ -100,6 +100,9 @@ int parse_leases(struct conf_t *state)
|
||||||
line[0] = '\0';
|
line[0] = '\0';
|
||||||
ipstring = xmalloc(sizeof(char) * MAXLEN);
|
ipstring = xmalloc(sizeof(char) * MAXLEN);
|
||||||
ipstring[0] = '\0';
|
ipstring[0] = '\0';
|
||||||
|
endsstr[0] = '\0';
|
||||||
|
startsstr[0] = '\0';
|
||||||
|
hostnamestr[0] = '\0';
|
||||||
while (!feof(dhcpd_leases)) {
|
while (!feof(dhcpd_leases)) {
|
||||||
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
|
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
|
||||||
error(EXIT_FAILURE, errno, "parse_leases: %s", state->dhcpdlease_file);
|
error(EXIT_FAILURE, errno, "parse_leases: %s", state->dhcpdlease_file);
|
||||||
|
|
@ -142,8 +145,32 @@ int parse_leases(struct conf_t *state)
|
||||||
break;
|
break;
|
||||||
memcpy(macstring, line + 20, 17);
|
memcpy(macstring, line + 20, 17);
|
||||||
macstring[17] = '\0';
|
macstring[17] = '\0';
|
||||||
if ((lease = find_lease(state, &addr)) != NULL)
|
if ((lease = find_lease(state, &addr)) != NULL) {
|
||||||
lease->ethernet = xstrdup(macstring);
|
lease->ethernet = xstrdup(macstring);
|
||||||
|
lease->starts = xstrdup(startsstr);
|
||||||
|
lease->ends = xstrdup(endsstr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PREFIX_ENDS:
|
||||||
|
if (state->print_mac_addreses == 0)
|
||||||
|
break;
|
||||||
|
strncpy(endsstr, line + 7, sizeof(endsstr)-1);
|
||||||
|
endsstr[strlen(endsstr)-2] = '\0';
|
||||||
|
break;
|
||||||
|
case PREFIX_STARTS:
|
||||||
|
if (state->print_mac_addreses == 0)
|
||||||
|
break;
|
||||||
|
strncpy(startsstr, line + 9, sizeof(startsstr)-1);
|
||||||
|
startsstr[strlen(startsstr)-2] = '\0';
|
||||||
|
break;
|
||||||
|
case PREFIX_HOSTNAME:
|
||||||
|
if (state->print_mac_addreses == 0)
|
||||||
|
break;
|
||||||
|
strncpy(hostnamestr, line + 19, sizeof(hostnamestr)-1);
|
||||||
|
hostnamestr[strlen(hostnamestr)-3] = '\0';
|
||||||
|
if ((lease = find_lease(state, &addr)) != NULL) {
|
||||||
|
lease->hostname = xstrdup(hostnamestr);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* do nothing */ ;
|
/* do nothing */ ;
|
||||||
|
|
|
||||||
15
src/hash.c
15
src/hash.c
|
|
@ -66,6 +66,9 @@ void add_lease_v4(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
|
||||||
l->type = type;
|
l->type = type;
|
||||||
HASH_ADD_INT(state->leases, ip.v4, l);
|
HASH_ADD_INT(state->leases, ip.v4, l);
|
||||||
l->ethernet = NULL;
|
l->ethernet = NULL;
|
||||||
|
l->ends = NULL;
|
||||||
|
l->starts = NULL;
|
||||||
|
l->hostname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_lease_v6(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
|
void add_lease_v6(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
|
||||||
|
|
@ -77,6 +80,9 @@ void add_lease_v6(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
|
||||||
l->type = type;
|
l->type = type;
|
||||||
HASH_ADD_V6(state->leases, ip.v6, l);
|
HASH_ADD_V6(state->leases, ip.v6, l);
|
||||||
l->ethernet = NULL;
|
l->ethernet = NULL;
|
||||||
|
l->ends = NULL;
|
||||||
|
l->starts = NULL;
|
||||||
|
l->hostname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Find pointer to lease from hash array.
|
/*! \brief Find pointer to lease from hash array.
|
||||||
|
|
@ -110,6 +116,9 @@ struct leases_t *find_lease_v6(struct conf_t *state, union ipaddr_t *addr)
|
||||||
void delete_lease(struct conf_t *state, struct leases_t *lease)
|
void delete_lease(struct conf_t *state, struct leases_t *lease)
|
||||||
{
|
{
|
||||||
free(lease->ethernet);
|
free(lease->ethernet);
|
||||||
|
free(lease->ends);
|
||||||
|
free(lease->starts);
|
||||||
|
free(lease->hostname);
|
||||||
HASH_DEL(state->leases, lease);
|
HASH_DEL(state->leases, lease);
|
||||||
free(lease);
|
free(lease);
|
||||||
}
|
}
|
||||||
|
|
@ -122,6 +131,9 @@ void delete_all_leases(struct conf_t *state)
|
||||||
|
|
||||||
HASH_ITER(hh, state->leases, l, tmp) {
|
HASH_ITER(hh, state->leases, l, tmp) {
|
||||||
free(l->ethernet);
|
free(l->ethernet);
|
||||||
|
free(l->ends);
|
||||||
|
free(l->starts);
|
||||||
|
free(l->hostname);
|
||||||
HASH_DEL(state->leases, l);
|
HASH_DEL(state->leases, l);
|
||||||
free(l);
|
free(l);
|
||||||
}
|
}
|
||||||
|
|
@ -134,6 +146,9 @@ void delete_all_leases(struct conf_t *state)
|
||||||
|
|
||||||
l = state->leases;
|
l = state->leases;
|
||||||
free(l->ethernet);
|
free(l->ethernet);
|
||||||
|
free(l->ends);
|
||||||
|
free(l->starts);
|
||||||
|
free(l->hostname);
|
||||||
HASH_DEL(state->leases, l); /* leases advances to next on delete */
|
HASH_DEL(state->leases, l); /* leases advances to next on delete */
|
||||||
free(l);
|
free(l);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
src/other.c
12
src/other.c
|
|
@ -417,6 +417,12 @@ int
|
||||||
}
|
}
|
||||||
if (!memcmp("lease ", str, 6))
|
if (!memcmp("lease ", str, 6))
|
||||||
return PREFIX_LEASE;
|
return PREFIX_LEASE;
|
||||||
|
else if (!memcmp(" starts ", str, 9))
|
||||||
|
return PREFIX_STARTS;
|
||||||
|
else if (!memcmp(" ends ", str, 7))
|
||||||
|
return PREFIX_ENDS;
|
||||||
|
else if (!memcmp(" client-hostname ", str, 18))
|
||||||
|
return PREFIX_HOSTNAME;
|
||||||
return NUM_OF_PREFIX;
|
return NUM_OF_PREFIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -472,6 +478,12 @@ int
|
||||||
}
|
}
|
||||||
if (!memcmp(" iaaddr ", str, 9))
|
if (!memcmp(" iaaddr ", str, 9))
|
||||||
return PREFIX_LEASE;
|
return PREFIX_LEASE;
|
||||||
|
else if (!memcmp(" starts ", str, 9))
|
||||||
|
return PREFIX_STARTS;
|
||||||
|
else if (!memcmp(" ends ", str, 7))
|
||||||
|
return PREFIX_ENDS;
|
||||||
|
else if (!memcmp(" client-hostname ", str, 18))
|
||||||
|
return PREFIX_HOSTNAME;
|
||||||
return NUM_OF_PREFIX;
|
return NUM_OF_PREFIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
26
src/output.c
26
src/output.c
|
|
@ -387,7 +387,19 @@ static int output_xml(struct conf_t *state)
|
||||||
if (l->ethernet != NULL) {
|
if (l->ethernet != NULL) {
|
||||||
fputs(l->ethernet, outfile);
|
fputs(l->ethernet, outfile);
|
||||||
}
|
}
|
||||||
fputs("</macaddress>\n</active_lease>\n", outfile);
|
fputs("</macaddress>\n\t<starts>", outfile);
|
||||||
|
if (l->starts != NULL) {
|
||||||
|
fputs(l->starts, outfile);
|
||||||
|
}
|
||||||
|
fputs("</starts>\n\t<ends>", outfile);
|
||||||
|
if (l->ends != NULL) {
|
||||||
|
fputs(l->ends, outfile);
|
||||||
|
}
|
||||||
|
fputs("</ends>\n\t<hostname>", outfile);
|
||||||
|
if (l->hostname != NULL) {
|
||||||
|
fputs(l->hostname, outfile);
|
||||||
|
}
|
||||||
|
fputs("</hostname>\n</active_lease>\n", outfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -481,6 +493,18 @@ static int output_json(struct conf_t *state)
|
||||||
if (l->ethernet != NULL) {
|
if (l->ethernet != NULL) {
|
||||||
fputs(l->ethernet, outfile);
|
fputs(l->ethernet, outfile);
|
||||||
}
|
}
|
||||||
|
fputs("\", \"starts\":\"", outfile);
|
||||||
|
if (l->starts != NULL) {
|
||||||
|
fputs(l->starts, outfile);
|
||||||
|
}
|
||||||
|
fputs("\", \"ends\":\"", outfile);
|
||||||
|
if (l->ends != NULL) {
|
||||||
|
fputs(l->ends, outfile);
|
||||||
|
}
|
||||||
|
fputs("\", \"hostname\":\"", outfile);
|
||||||
|
if (l->hostname != NULL) {
|
||||||
|
fputs(l->hostname, outfile);
|
||||||
|
}
|
||||||
fputs("\" }", outfile);
|
fputs("\" }", outfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"active_leases": [
|
"active_leases": [
|
||||||
{ "ip":"10.0.0.5", "macaddress":"00:00:00:00:00:00" }
|
{ "ip":"10.0.0.5", "macaddress":"00:00:00:00:00:00", "starts":"", "ends":"", "hostname":"" }
|
||||||
],
|
],
|
||||||
"subnets": [
|
"subnets": [
|
||||||
{ "location":"All networks", "range":"10.0.0.1 - 10.0.0.10", "first_ip":"10.0.0.1", "last_ip":"10.0.0.10", "defined":10, "used":1, "touched":0, "free":9, "percent":10, "touch_count":1, "touch_percent":10, "status":0 }
|
{ "location":"All networks", "range":"10.0.0.1 - 10.0.0.10", "first_ip":"10.0.0.1", "last_ip":"10.0.0.10", "defined":10, "used":1, "touched":0, "free":9, "percent":10, "touch_count":1, "touch_percent":10, "status":0 }
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,9 @@
|
||||||
<active_lease>
|
<active_lease>
|
||||||
<ip>10.0.0.5</ip>
|
<ip>10.0.0.5</ip>
|
||||||
<macaddress>00:00:00:00:00:00</macaddress>
|
<macaddress>00:00:00:00:00:00</macaddress>
|
||||||
|
<starts></starts>
|
||||||
|
<ends></ends>
|
||||||
|
<hostname></hostname>
|
||||||
</active_lease>
|
</active_lease>
|
||||||
<subnet>
|
<subnet>
|
||||||
<location>All networks</location>
|
<location>All networks</location>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue