Skip to content

Commit

Permalink
Merge pull request #4319 from indrajitr/vyos-t6998-retry
Browse files Browse the repository at this point in the history
dhcp: T6998: Make dhcp lease datetime timezone aware
  • Loading branch information
dmbaturin authored Jan 27, 2025
2 parents 10ee7ac + e8e05f8 commit cbe364a
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 31 deletions.
29 changes: 12 additions & 17 deletions python/vyos/kea.py
Original file line number Diff line number Diff line change
Expand Up @@ -474,12 +474,11 @@ def kea_get_server_leases(config, inet, pools=[], state=[], origin=None) -> list
data = []
for lease in leases:
lifetime = lease['valid-lft']
expiry = lease['cltt'] + lifetime
start = lease['cltt']
expiry = start + lifetime

lease['start_timestamp'] = datetime.fromtimestamp(
expiry - lifetime, timezone.utc
)
lease['expire_timestamp'] = (
lease['start_time'] = datetime.fromtimestamp(start, timezone.utc)
lease['expire_time'] = (
datetime.fromtimestamp(expiry, timezone.utc) if expiry else None
)

Expand All @@ -493,18 +492,18 @@ def kea_get_server_leases(config, inet, pools=[], state=[], origin=None) -> list
else '-'
)
data_lease['end'] = (
lease['expire_timestamp'].timestamp() if lease['expire_timestamp'] else None
lease['expire_time'].timestamp() if lease['expire_time'] else None
)
data_lease['origin'] = 'local' # TODO: Determine remote in HA
# remove trailing dot in 'hostname' to ensure consistency for `vyos-hostsd-client`
data_lease['hostname'] = lease.get('hostname', '-').rstrip('.')

if inet == '4':
data_lease['mac'] = lease['hw-address']
data_lease['start'] = lease['start_timestamp'].timestamp()
data_lease['start'] = lease['start_time'].timestamp()

if inet == '6':
data_lease['last_communication'] = lease['start_timestamp'].timestamp()
data_lease['last_communication'] = lease['start_time'].timestamp()
data_lease['duid'] = _format_hex_string(lease['duid'])
data_lease['type'] = lease['type']

Expand All @@ -514,15 +513,11 @@ def kea_get_server_leases(config, inet, pools=[], state=[], origin=None) -> list

data_lease['remaining'] = '-'

if lease['valid-lft'] > 0:
data_lease['remaining'] = lease['expire_timestamp'] - datetime.now(
timezone.utc
)

if data_lease['remaining'].days >= 0:
# substraction gives us a timedelta object which can't be formatted with strftime
# so we use str(), split gets rid of the microseconds
data_lease['remaining'] = str(data_lease['remaining']).split('.')[0]
now = datetime.now(timezone.utc)
if lease['valid-lft'] > 0 and lease['expire_time'] > now:
# substraction gives us a timedelta object which can't be formatted
# with strftime so we use str(), split gets rid of the microseconds
data_lease['remaining'] = str(lease['expire_time'] - now).split('.')[0]

# Do not add old leases
if (
Expand Down
29 changes: 15 additions & 14 deletions src/op_mode/dhcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import typing

from datetime import datetime
from datetime import timezone
from glob import glob
from ipaddress import ip_address
from tabulate import tabulate
Expand Down Expand Up @@ -81,12 +82,6 @@
ArgOrigin = typing.Literal['local', 'remote']


def _utc_to_local(utc_dt):
return datetime.fromtimestamp(
(datetime.fromtimestamp(utc_dt) - datetime(1970, 1, 1)).total_seconds()
)


def _get_raw_server_leases(
config, family='inet', pool=None, sorted=None, state=[], origin=None
) -> list:
Expand All @@ -110,10 +105,12 @@ def _get_formatted_server_leases(raw_data, family='inet'):
ipaddr = lease.get('ip')
hw_addr = lease.get('mac')
state = lease.get('state')
start = lease.get('start')
start = _utc_to_local(start).strftime('%Y/%m/%d %H:%M:%S')
end = lease.get('end')
end = _utc_to_local(end).strftime('%Y/%m/%d %H:%M:%S') if end else '-'
start = datetime.fromtimestamp(lease.get('start'), timezone.utc)
end = (
datetime.fromtimestamp(lease.get('end'), timezone.utc)
if lease.get('end')
else '-'
)
remain = lease.get('remaining')
pool = lease.get('pool')
hostname = lease.get('hostname')
Expand All @@ -138,10 +135,14 @@ def _get_formatted_server_leases(raw_data, family='inet'):
for lease in raw_data:
ipaddr = lease.get('ip')
state = lease.get('state')
start = lease.get('last_communication')
start = _utc_to_local(start).strftime('%Y/%m/%d %H:%M:%S')
end = lease.get('end')
end = _utc_to_local(end).strftime('%Y/%m/%d %H:%M:%S')
start = datetime.fromtimestamp(
lease.get('last_communication'), timezone.utc
)
end = (
datetime.fromtimestamp(lease.get('end'), timezone.utc)
if lease.get('end')
else '-'
)
remain = lease.get('remaining')
lease_type = lease.get('type')
pool = lease.get('pool')
Expand Down

0 comments on commit cbe364a

Please sign in to comment.