SHA256
1
0
forked from pool/dhcp
dhcp/leases.awk

117 lines
2.9 KiB
Awk

#!/usr/bin/awk -f
# Author: wilsonj@cs.baylor.edu
# Date: I think I wrote this January 2002
# Disclaimer: at one point, it worked with the lease file for ISC DHCPD v3.0pl2
# legalese: Copyright © 1998-2003 Baylor University
# THIS SOFTWARE, DATA AND/OR DOCUMENTATION ARE PROVIDED "AS IS"
# AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
# LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE.
# Expected input: /var/lib/dhcp/db/dhcpd.leases
# (For best results, pre-process the lease
# file with 'grep -v "uid \""')
# Usually invoked as, 'leases.awk /var/lib/dhcp/db/dhcpd.leases'
# Format of output (tab-delimited):
# ip,hardware[ip],compname[ip],state[ip],expiration-time-in-GMT[ip]
# set the RECORD SEPARATOR, RS, to "}" ... records span multiple lines
BEGIN {RS="}"}
# we only care about records that are greater than so-many-characters
# (why 5? I guess a CRLF may be 2 bytes ... isn't it just LF in BSD?)
length($0) > 5 { total++
# only want record those variables we've captured,
# so reset values to null
endtime = ""
hwaddr = ""
cn = ""
st = ""
for(i=1;i<=NF;i++) {
# if this field matches the word "lease"
if($i ~ /lease/)
# capture the next field into ipaddr
ipaddr=$(i+1)
# if this field matches the word "ethernet"
else if($i ~ /ethernet/) {
# get rid of the trailing semi-colon
split($(i+1),arr,";")
# and capture the hwaddr with ipaddr as key
hwaddr=arr[1]
}
# if this field matches the word "client-hostname"
else if($i ~ /client-hostname/) {
# get rid of the enclosing quotes
split($(i+1),arr,"\"")
# capture the computer name
cn=arr[2]
}
# if this field matches the word "binding"
else if($i ~ /binding/) {
# we don't care about what the next binding state is
# so go on and process the rest of this record
if($(i-1) ~ /next/) { # do nothing
}
else {
split($(i+2),arr,";")
st=arr[1]
}
}
# give me a timestamp or two
else if($i ~ /ends/) {
#if $i == "ends" then $i+2 is enddate, and $i+3 is endtime
dtstmp = $(i+2);
split($(i+3),arr,";")
tmstmp = arr[1];
endtime=sprintf("%s %s",dtstmp,tmstmp)
}
}
if( length(hwaddr) > 0 )
hardware[ipaddr]=hwaddr
else
hardward[ipaddr]="NONE"
if( length(cn) > 0 )
compname[ipaddr]=cn
else
compname[ipaddr]="NONE"
if( length(st) > 0 )
state[ipaddr]=st
else
state[ipaddr]="NONE"
if( length(endtime) > 0 )
mytime[ipaddr]=endtime
else
mytime[ipaddr]="NONE"
}
# for every ipaddr we captured, display ip, hardware, and compname
END { for(ip in hardware) {
if(length(IP_ONLY)>0)
print ip
else
printf("%s\t%s\t%s\t%s\t%s\n",\
ip,hardware[ip],compname[ip],state[ip],mytime[ip])
}
}