mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-31 13:03:02 +02:00
Merge pull request #690 from rical/fix-long-frr-uptime
yanger: handle all frr uptime formats
This commit is contained in:
@@ -150,6 +150,9 @@ class Route:
|
||||
|
||||
def datetime2uptime(self):
|
||||
"""Convert 'last-updated' string to uptime in AAhBBmCCs format."""
|
||||
ONE_DAY_SECOND = 60 * 60 * 24
|
||||
ONE_WEEK_SECOND = ONE_DAY_SECOND * 7
|
||||
|
||||
if not self.last_updated:
|
||||
return "0h0m0s"
|
||||
|
||||
@@ -164,10 +167,21 @@ class Route:
|
||||
current_time = datetime_now()
|
||||
uptime_delta = current_time - last_updated
|
||||
|
||||
hours, remainder = divmod(int(uptime_delta.total_seconds()), 3600)
|
||||
minutes, seconds = divmod(remainder, 60)
|
||||
total_seconds = int(uptime_delta.total_seconds())
|
||||
total_days = total_seconds // ONE_DAY_SECOND
|
||||
total_weeks = total_days // 7
|
||||
|
||||
return f"{hours}h{minutes}m{seconds}s"
|
||||
hours = (total_seconds % ONE_DAY_SECOND) // 3600
|
||||
minutes = (total_seconds % 3600) // 60
|
||||
seconds = total_seconds % 60
|
||||
|
||||
if total_seconds < ONE_DAY_SECOND:
|
||||
return f"{hours:02}:{minutes:02}:{seconds:02}"
|
||||
elif total_seconds < ONE_WEEK_SECOND:
|
||||
return f"{total_days}d{hours:02}h{minutes:02}m"
|
||||
else:
|
||||
days_remaining = total_days % 7
|
||||
return f"{total_weeks:02}w{days_remaining}d{hours:02}h"
|
||||
|
||||
def print(self):
|
||||
PadRoute.set(self.ip)
|
||||
|
||||
@@ -6,6 +6,7 @@ import json
|
||||
import sys # (built-in module)
|
||||
import os
|
||||
import argparse
|
||||
from re import match
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
TESTPATH = ""
|
||||
@@ -235,8 +236,35 @@ def add_hardware(hw_out):
|
||||
|
||||
|
||||
def uptime2datetime(uptime):
|
||||
"""Convert uptime (HH:MM:SS) to YANG format (YYYY-MM-DDTHH:MM:SS+00:00)"""
|
||||
h, m, s = map(int, uptime.split(':'))
|
||||
"""
|
||||
Convert uptime to YANG format (YYYY-MM-DDTHH:MM:SS+00:00)
|
||||
|
||||
Handles the following input formats (frrtime):
|
||||
HH:MM:SS
|
||||
XdXXhXXm
|
||||
XXwXdXXh
|
||||
"""
|
||||
h = m = s = 0
|
||||
|
||||
# Format HH:MM:SS
|
||||
if match(r'^\d{2}:\d{2}:\d{2}$', uptime):
|
||||
h, m, s = map(int, uptime.split(':'))
|
||||
|
||||
# Format XdXXhXXm (days, hours, minutes)
|
||||
elif match(r'^\d+d\d{2}h\d{2}m$', uptime):
|
||||
days = int(uptime.split('d')[0])
|
||||
h = int(uptime.split('d')[1].split('h')[0])
|
||||
m = int(uptime.split('h')[1].split('m')[0])
|
||||
h += days * 24
|
||||
|
||||
# Format XwXdXXh (weeks, days, hours)
|
||||
elif match(r'^\d{2}w\d{1}d\d{2}h$', uptime):
|
||||
weeks = int(uptime.split('w')[0])
|
||||
days = int(uptime.split('w')[1].split('d')[0])
|
||||
h = int(uptime.split('d')[1].split('h')[0])
|
||||
h += weeks * 7 * 24
|
||||
h += days * 24
|
||||
|
||||
uptime_delta = timedelta(hours=h, minutes=m, seconds=s)
|
||||
current_time = datetime_now()
|
||||
last_updated = current_time - uptime_delta
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
[7m DESTINATION PREF NEXT-HOP PROTO UPTIME[0m
|
||||
>* 0.0.0.0/0 110/2 10.0.23.1 ospfv2 0h0m0s
|
||||
>* 10.0.0.1/32 110/4000 10.0.13.1 ospfv2 0h0m0s
|
||||
10.0.0.3/32 110/0 lo ospfv2 0h0m0s
|
||||
>* 10.0.0.3/32 0/0 lo direct 0h0m0s
|
||||
10.0.13.0/30 110/2000 e5 ospfv2 0h0m0s
|
||||
>* 10.0.13.0/30 0/0 e5 direct 0h0m0s
|
||||
10.0.23.0/30 110/1 e6 ospfv2 0h0m0s
|
||||
>* 10.0.23.0/30 0/0 e6 direct 0h0m0s
|
||||
192.168.3.0/24 110/1 e2 ospfv2 0h0m0s
|
||||
>* 192.168.3.0/24 0/0 e2 direct 0h0m0s
|
||||
>* 0.0.0.0/0 110/2 10.0.23.1 ospfv2 00:00:00
|
||||
>* 10.0.0.1/32 110/4000 10.0.13.1 ospfv2 00:00:00
|
||||
10.0.0.3/32 110/0 lo ospfv2 00:00:00
|
||||
>* 10.0.0.3/32 0/0 lo direct 00:00:00
|
||||
10.0.13.0/30 110/2000 e5 ospfv2 00:00:00
|
||||
>* 10.0.13.0/30 0/0 e5 direct 00:00:00
|
||||
10.0.23.0/30 110/1 e6 ospfv2 00:00:00
|
||||
>* 10.0.23.0/30 0/0 e6 direct 20:10:05
|
||||
192.168.3.0/24 110/1 e2 ospfv2 5d13h05m
|
||||
>* 192.168.3.0/24 0/0 e2 direct 01w1d13h
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
[7m DESTINATION PREF NEXT-HOP PROTO UPTIME[0m
|
||||
>* ::/0 1/0 2001:db8:3c4d:50::1 static 0h0m0s
|
||||
>* 2001:db8:3c4d:50::/64 0/0 e6 direct 0h0m0s
|
||||
>* 2001:db8:3c4d:200::1/128 0/0 lo direct 0h0m0s
|
||||
* fe80::/64 0/0 e7 direct 0h0m0s
|
||||
* fe80::/64 0/0 e6 direct 0h0m0s
|
||||
* fe80::/64 0/0 e5 direct 0h0m0s
|
||||
* fe80::/64 0/0 e4 direct 0h0m0s
|
||||
* fe80::/64 0/0 e3 direct 0h0m0s
|
||||
* fe80::/64 0/0 e2 direct 0h0m0s
|
||||
>* fe80::/64 0/0 e1 direct 0h0m0s
|
||||
>* ::/0 1/0 2001:db8:3c4d:50::1 static 00:00:00
|
||||
>* 2001:db8:3c4d:50::/64 0/0 e6 direct 00:00:00
|
||||
>* 2001:db8:3c4d:200::1/128 0/0 lo direct 00:00:00
|
||||
* fe80::/64 0/0 e7 direct 00:00:00
|
||||
* fe80::/64 0/0 e6 direct 00:00:00
|
||||
* fe80::/64 0/0 e5 direct 00:00:00
|
||||
* fe80::/64 0/0 e4 direct 00:00:00
|
||||
* fe80::/64 0/0 e3 direct 00:00:00
|
||||
* fe80::/64 0/0 e2 direct 00:00:00
|
||||
>* fe80::/64 0/0 e1 direct 00:00:00
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
"internalNextHopActiveNum":1,
|
||||
"nexthopGroupId":23,
|
||||
"installedNexthopGroupId":23,
|
||||
"uptime":"00:00:00",
|
||||
"uptime":"20:10:05",
|
||||
"nexthops":[
|
||||
{
|
||||
"flags":3,
|
||||
@@ -256,7 +256,7 @@
|
||||
"internalNextHopNum":1,
|
||||
"internalNextHopActiveNum":1,
|
||||
"nexthopGroupId":33,
|
||||
"uptime":"00:00:00",
|
||||
"uptime":"5d13h05m",
|
||||
"nexthops":[
|
||||
{
|
||||
"flags":1,
|
||||
@@ -286,7 +286,7 @@
|
||||
"internalNextHopActiveNum":1,
|
||||
"nexthopGroupId":17,
|
||||
"installedNexthopGroupId":17,
|
||||
"uptime":"00:00:00",
|
||||
"uptime":"01w1d13h",
|
||||
"nexthops":[
|
||||
{
|
||||
"flags":3,
|
||||
|
||||
Reference in New Issue
Block a user