Skip to content

Commit c02a749

Browse files
committed
Add support for NTP server details to EOS
1 parent 145c7b7 commit c02a749

File tree

6 files changed

+223
-12
lines changed

6 files changed

+223
-12
lines changed

napalm/eos/eos.py

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,21 +1202,78 @@ def get_arp_table(self, vrf=""):
12021202
return arp_table
12031203

12041204
def get_ntp_servers(self):
1205-
commands = ["show running-config | section ntp"]
1205+
result = {}
12061206

1207-
raw_ntp_config = self._run_commands(commands, encoding="text")[0].get(
1208-
"output", ""
1209-
)
1207+
commands = ["show running-config | section ntp"]
12101208

1211-
ntp_config = napalm.base.helpers.textfsm_extractor(
1212-
self, "ntp_peers", raw_ntp_config
1209+
raw_ntp_config = (
1210+
self._run_commands(commands, encoding="text")[0]
1211+
.get("output", "")
1212+
.splitlines()
12131213
)
12141214

1215-
return {
1216-
str(ntp_peer.get("ntppeer")): {}
1217-
for ntp_peer in ntp_config
1218-
if ntp_peer.get("ntppeer", "")
1219-
}
1215+
for server in raw_ntp_config:
1216+
details = {
1217+
"port": 123,
1218+
"version": 4,
1219+
"association_type": "SERVER",
1220+
"iburst": False,
1221+
"prefer": False,
1222+
"network_instance": "default",
1223+
"source_address": "",
1224+
"key_id": -1,
1225+
}
1226+
tokens = server.split()
1227+
if tokens[2] == "vrf":
1228+
details["network_instance"] = tokens[3]
1229+
server_ip = details["address"] = tokens[4]
1230+
idx = 5
1231+
else:
1232+
server_ip = details["address"] = tokens[2]
1233+
idx = 3
1234+
try:
1235+
parsed_address = napalm.base.helpers.ipaddress.ip_address(server_ip)
1236+
family = parsed_address.version
1237+
except ValueError:
1238+
# Assume family of 4, unless local-interface has no IPv4 addresses
1239+
family = 4
1240+
while idx < len(tokens):
1241+
if tokens[idx] == "iburst":
1242+
details["iburst"] = True
1243+
idx += 1
1244+
1245+
elif tokens[idx] == "key":
1246+
details["key_id"] = int(tokens[idx + 1])
1247+
idx += 2
1248+
1249+
elif tokens[idx] == "local-interface":
1250+
interfaces = self.get_interfaces_ip()
1251+
intf = tokens[idx + 1]
1252+
if family == 6 and interfaces[intf]["ipv6"]:
1253+
details["source_address"] = list(
1254+
interfaces[intf]["ipv6"].keys()
1255+
)[0]
1256+
elif interfaces[intf]["ipv4"]:
1257+
details["source_address"] = list(
1258+
interfaces[intf]["ipv4"].keys()
1259+
)[0]
1260+
elif interfaces[intf]["ipv6"]:
1261+
details["source_address"] = list(
1262+
interfaces[intf]["ipv6"].keys()
1263+
)[0]
1264+
idx += 2
1265+
1266+
elif tokens[idx] == "version":
1267+
details["version"] = int(tokens[idx + 1])
1268+
idx += 2
1269+
1270+
elif tokens[idx] == "prefer":
1271+
details["prefer"] = True
1272+
idx += 1
1273+
1274+
result[server_ip] = details
1275+
1276+
return result
12201277

12211278
def get_ntp_stats(self):
12221279
ntp_stats = []
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"1.2.3.4": {
3+
"port": 123,
4+
"version": 4,
5+
"association_type": "SERVER",
6+
"iburst": true,
7+
"prefer": true,
8+
"network_instance": "FOO",
9+
"source_address": "",
10+
"key_id": -1,
11+
"address": "1.2.3.4"
12+
},
13+
"4.3.2.1": {
14+
"port": 123,
15+
"version": 4,
16+
"association_type": "SERVER",
17+
"iburst": false,
18+
"prefer": false,
19+
"network_instance": "FOO",
20+
"source_address": "172.20.20.2",
21+
"key_id": -1,
22+
"address": "4.3.2.1"
23+
}
24+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"interfaces": {
3+
"Management0": {
4+
"name": "Management0",
5+
"lineProtocolStatus": "up",
6+
"interfaceStatus": "connected",
7+
"mtu": 1500,
8+
"interfaceAddressBrief": {
9+
"ipAddr": {
10+
"address": "172.20.20.2",
11+
"maskLen": 24
12+
}
13+
},
14+
"ipv4Routable240": false,
15+
"ipv4Routable0": false,
16+
"enabled": true,
17+
"description": "",
18+
"interfaceAddress": {
19+
"primaryIp": {
20+
"address": "172.20.20.2",
21+
"maskLen": 24
22+
},
23+
"secondaryIps": {},
24+
"secondaryIpsOrderedList": [],
25+
"virtualIp": {
26+
"address": "0.0.0.0",
27+
"maskLen": 0
28+
},
29+
"virtualSecondaryIps": {},
30+
"virtualSecondaryIpsOrderedList": [],
31+
"broadcastAddress": "255.255.255.255",
32+
"dhcp": false
33+
},
34+
"proxyArp": false,
35+
"proxyArpAllowDefault": false,
36+
"localProxyArp": false,
37+
"gratuitousArp": false,
38+
"routedAddr": "00:1c:73:7b:8c:1d",
39+
"isVrrpBackup": false,
40+
"vrf": "default",
41+
"urpf": "disable",
42+
"addresslessForwarding": "isInvalid",
43+
"directedBroadcastEnabled": false,
44+
"maxMssIngress": 0,
45+
"maxMssEgress": 0
46+
}
47+
}
48+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"interfaces": {
3+
"Management0": {
4+
"name": "Management0",
5+
"lineProtocolStatus": "up",
6+
"interfaceStatus": "connected",
7+
"mtu": 1500,
8+
"linkLocal": {
9+
"address": "fe80::21c:73ff:fe7b:8c1d",
10+
"subnet": "fe80::/64",
11+
"active": true,
12+
"leastpref": false,
13+
"dadfailed": false
14+
},
15+
"state": "enabled",
16+
"addresses": [
17+
{
18+
"address": "2001:172:20:20::2",
19+
"subnet": "2001:172:20:20::/64",
20+
"active": true,
21+
"leastpref": false,
22+
"dadfailed": false
23+
}
24+
],
25+
"globalAddressesAreVirtual": false,
26+
"multicastGroupAddresses": [
27+
"ff02::1",
28+
"ff02::1:ff00:2",
29+
"ff02::1:ff7b:8c1d"
30+
],
31+
"dadStatus": "unavailable",
32+
"dadAttempts": -1,
33+
"ndReachableTime": 30000,
34+
"ndRetransmitInterval": 1000,
35+
"enhancedDad": false,
36+
"autoConfigStatus": "stateless",
37+
"urpf": "disable",
38+
"urpfV4V6Mismatch": false,
39+
"vrf": "default",
40+
"addrSource": "manual",
41+
"maxMssIngress": 0,
42+
"maxMssEgress": 0,
43+
"acceptUnsolicitedNa": false
44+
}
45+
}
46+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ntp server vrf FOO 1.2.3.4 prefer iburst
2+
ntp server vrf FOO 4.3.2.1 local-interface Management0
Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,35 @@
1-
{"1.2.3.4": {}, "2001:0db8:0a0b:12f0:0000:0000:0000:0001": {}, "5.6.7.8": {}}
1+
{
2+
"1.2.3.4": {
3+
"port": 123,
4+
"version": 4,
5+
"association_type": "SERVER",
6+
"iburst": false,
7+
"prefer": false,
8+
"network_instance": "default",
9+
"source_address": "",
10+
"key_id": -1,
11+
"address": "1.2.3.4"
12+
},
13+
"5.6.7.8": {
14+
"port": 123,
15+
"version": 4,
16+
"association_type": "SERVER",
17+
"iburst": false,
18+
"prefer": false,
19+
"network_instance": "default",
20+
"source_address": "",
21+
"key_id": -1,
22+
"address": "5.6.7.8"
23+
},
24+
"2001:0db8:0a0b:12f0:0000:0000:0000:0001": {
25+
"port": 123,
26+
"version": 4,
27+
"association_type": "SERVER",
28+
"iburst": false,
29+
"prefer": false,
30+
"network_instance": "default",
31+
"source_address": "",
32+
"key_id": -1,
33+
"address": "2001:0db8:0a0b:12f0:0000:0000:0000:0001"
34+
}
35+
}

0 commit comments

Comments
 (0)