Dhcp6 parser
This commit is contained in:
parent
bb2b357d8f
commit
6bc18cbb54
2 changed files with 152 additions and 50 deletions
|
|
@ -22,50 +22,62 @@ public record struct KeaDhcp4Lease(
|
|||
{
|
||||
public static KeaDhcp4Lease Parse(in SepReader.Row row)
|
||||
{
|
||||
var address = IPAddress.Parse(row[0].Span);
|
||||
PhysicalAddress hwaddr = PhysicalAddress.None;
|
||||
if (row[1].Span is { IsEmpty: false } physical)
|
||||
KeaDhcp4Lease result = new();
|
||||
for (int i = 0; i < row.ColCount; i++)
|
||||
{
|
||||
hwaddr = PhysicalAddress.Parse(physical);
|
||||
}
|
||||
string? clientId = row[2].ToString();
|
||||
uint validLifetime = uint.Parse(row[3].Span);
|
||||
DateTimeOffset expire = DateTimeOffset.FromUnixTimeSeconds(unchecked((long)ulong.Parse(row[4].Span)));
|
||||
uint subnetId = uint.Parse(row[5].Span);
|
||||
bool fqdnFwd = sbyte.Parse(row[6].Span) != 0;
|
||||
bool fqdnRev = sbyte.Parse(row[7].Span) != 0;
|
||||
string hostname = KeaDhcpLease.Unescape(row[8].Span);
|
||||
var span = row[i].Span;
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
result.Address = IPAddress.Parse(span);
|
||||
break;
|
||||
|
||||
uint state = 0;
|
||||
if (row.ColCount > 9)
|
||||
{
|
||||
state = uint.Parse(row[9].Span);
|
||||
case 1 when !span.IsWhiteSpace():
|
||||
result.HWAddr = PhysicalAddress.Parse(span);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
result.ClientId = span.ToString();
|
||||
break;
|
||||
|
||||
case 3:
|
||||
result.ValidLifetime = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
result.Expire = DateTimeOffset.FromUnixTimeSeconds(unchecked((long)ulong.Parse(span)));
|
||||
break;
|
||||
|
||||
case 5:
|
||||
result.SubnetId = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
result.FqdnFwd = byte.Parse(span) != 0;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
result.FqdnRev = byte.Parse(span) != 0;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
result.Hostname = KeaDhcpLease.Unescape(span);
|
||||
break;
|
||||
|
||||
case 9:
|
||||
result.State = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 10:
|
||||
result.UserContext = KeaDhcpLease.Unescape(span);
|
||||
break;
|
||||
|
||||
case 11:
|
||||
result.PoolId = uint.Parse(span);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
string? userContext = default;
|
||||
if (row.ColCount > 10)
|
||||
{
|
||||
userContext = KeaDhcpLease.Unescape(row[10].Span);
|
||||
}
|
||||
|
||||
uint poolId = 0;
|
||||
if (row.ColCount > 11)
|
||||
{
|
||||
poolId = uint.Parse(row[11].Span);
|
||||
}
|
||||
|
||||
return new(
|
||||
address,
|
||||
hwaddr,
|
||||
clientId,
|
||||
validLifetime,
|
||||
expire,
|
||||
subnetId,
|
||||
fqdnFwd,
|
||||
fqdnRev,
|
||||
hostname,
|
||||
state,
|
||||
userContext,
|
||||
poolId);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +1,113 @@
|
|||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
|
||||
using nietras.SeparatedValues;
|
||||
|
||||
namespace pdns_dhcp.Kea;
|
||||
|
||||
// ref: https://github.com/isc-projects/kea/blob/Kea-2.5.3/src/lib/dhcpsrv/csv_lease_file6.h
|
||||
public record struct KeaDhcp6Lease(
|
||||
string Address,
|
||||
IPAddress Address,
|
||||
string DUId,
|
||||
uint ValidLifetime,
|
||||
ulong Expire,
|
||||
string SubnetId,
|
||||
DateTimeOffset Expire,
|
||||
uint SubnetId,
|
||||
uint PrefLifetime,
|
||||
LeaseType LeaseType,
|
||||
uint IAId,
|
||||
byte PrefixLen,
|
||||
byte FqdnFwd,
|
||||
byte FqdnRev,
|
||||
bool FqdnFwd,
|
||||
bool FqdnRev,
|
||||
string Hostname,
|
||||
string HWAddr,
|
||||
PhysicalAddress HWAddr,
|
||||
uint State,
|
||||
string UserContext,
|
||||
string? UserContext,
|
||||
ushort? HWType,
|
||||
uint? HWAddrSource,
|
||||
uint PoolId
|
||||
);
|
||||
uint PoolId)
|
||||
{
|
||||
public static KeaDhcp6Lease Parse(in SepReader.Row row)
|
||||
{
|
||||
KeaDhcp6Lease result = new();
|
||||
for (int i = 0; i < row.ColCount; i++)
|
||||
{
|
||||
var span = row[i].Span;
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
result.Address = IPAddress.Parse(span);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
result.DUId = span.ToString();
|
||||
break;
|
||||
|
||||
case 2:
|
||||
result.ValidLifetime = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
result.Expire = DateTimeOffset.FromUnixTimeSeconds(unchecked((long)ulong.Parse(span)));
|
||||
break;
|
||||
|
||||
case 4:
|
||||
result.SubnetId = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
result.PrefLifetime = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
result.LeaseType = (LeaseType)byte.Parse(span);
|
||||
break;
|
||||
|
||||
case 7:
|
||||
result.IAId = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
result.PrefixLen = byte.Parse(span);
|
||||
break;
|
||||
|
||||
case 9:
|
||||
result.FqdnFwd = byte.Parse(span) != 0;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
result.FqdnRev = byte.Parse(span) != 0;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
result.Hostname = KeaDhcpLease.Unescape(span);
|
||||
break;
|
||||
|
||||
case 12 when !span.IsWhiteSpace():
|
||||
result.HWAddr = PhysicalAddress.Parse(span);
|
||||
break;
|
||||
|
||||
case 13:
|
||||
result.State = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 14 when !span.IsWhiteSpace():
|
||||
result.UserContext = KeaDhcpLease.Unescape(span);
|
||||
break;
|
||||
|
||||
case 15:
|
||||
result.HWType = ushort.Parse(span);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
result.HWAddrSource = uint.Parse(span);
|
||||
break;
|
||||
|
||||
case 17:
|
||||
result.PoolId = uint.Parse(span);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue