1
1
import click
2
+ import ast
2
3
from natsort import natsorted
3
4
from tabulate import tabulate
4
5
import show .vlan as show_vlan
7
8
from swsscommon .swsscommon import ConfigDBConnector
8
9
from swsscommon .swsscommon import SonicV2Connector
9
10
10
-
11
11
# STATE_DB Table
12
+ DHCPv4_COUNTER_TABLE = 'DHCP_COUNTER_TABLE'
12
13
DHCPv6_COUNTER_TABLE = 'DHCPv6_COUNTER_TABLE'
13
14
15
+ # DHCPv4 Counter Messages
16
+ dhcpv4_messages = [
17
+ "Unknown" , "Discover" , "Offer" , "Request" , "Decline" , "Ack" , "Nack" , "Release" , "Inform"
18
+ ]
19
+
14
20
# DHCPv6 Counter Messages
15
- messages = ["Unknown" , "Solicit" , "Advertise" , "Request" , "Confirm" , "Renew" , "Rebind" , "Reply" , "Release" , "Decline" ,
16
- "Reconfigure" , "Information-Request" , "Relay-Forward" , "Relay-Reply" , "Malformed" ]
21
+ dhcpv6_messages = [
22
+ "Unknown" , "Solicit" , "Advertise" , "Request" , "Confirm" , "Renew" , "Rebind" , "Reply" , "Release" ,
23
+ "Decline" , "Reconfigure" , "Information-Request" , "Relay-Forward" , "Relay-Reply" , "Malformed"
24
+ ]
17
25
18
26
# DHCP_RELAY Config Table
19
27
DHCP_RELAY = 'DHCP_RELAY'
@@ -37,6 +45,75 @@ def get_dhcp_helper_address(ctx, vlan):
37
45
38
46
show_vlan .VlanBrief .register_column ('DHCP Helper Address' , get_dhcp_helper_address )
39
47
48
+ class DHCPv4_Counter (object ):
49
+ def __init__ (self ):
50
+ self .db = SonicV2Connector (use_unix_socket_path = False )
51
+ self .db .connect (self .db .STATE_DB )
52
+ self .table_name = DHCPv4_COUNTER_TABLE + self .db .get_db_separator (self .db .STATE_DB )
53
+
54
+ def get_interface (self ):
55
+ """ Get all names of all interfaces in DHCPv4_COUNTER_TABLE """
56
+ interfaces = []
57
+ for key in self .db .keys (self .db .STATE_DB ):
58
+ if DHCPv4_COUNTER_TABLE in key :
59
+ interfaces .append (key [21 :])
60
+ return interfaces
61
+
62
+ def get_dhcp4relay_msg_count (self , interface , dir ):
63
+ """ Get count of a dhcprelay message """
64
+ value = self .db .get (self .db .STATE_DB , self .table_name + str (interface ), str (dir ))
65
+ cnts = ast .literal_eval (str (value ))
66
+ data = []
67
+ if cnts is not None :
68
+ for k , v in cnts .items ():
69
+ data .append ([k , v ])
70
+ return data
71
+
72
+ def clear_table (self , interface ):
73
+ """ Reset all message counts to 0 """
74
+ v4_cnts = {}
75
+ for msg in dhcpv4_messages :
76
+ v4_cnts [msg ] = '0'
77
+ self .db .set (self .db .STATE_DB , self .table_name + str (interface ), str ("RX" ), str (v4_cnts ))
78
+ self .db .set (self .db .STATE_DB , self .table_name + str (interface ), str ("TX" ), str (v4_cnts ))
79
+
80
+ def print_dhcpv4_count (counter , intf ):
81
+ """Print count of each message"""
82
+ rx_data = counter .get_dhcp4relay_msg_count (intf , "RX" )
83
+ print (tabulate (rx_data , headers = ["Message Type" , intf + "(RX)" ], tablefmt = 'simple' , stralign = 'right' ) + "\n " )
84
+ tx_data = counter .get_dhcp4relay_msg_count (intf , "TX" )
85
+ print (tabulate (tx_data , headers = ["Message Type" , intf + "(TX)" ], tablefmt = 'simple' , stralign = 'right' ) + "\n " )
86
+
87
+ #
88
+ # 'dhcp4relay_counters' group ###
89
+ #
90
+
91
+
92
+ @click .group (cls = clicommon .AliasedGroup , name = "dhcp4relay_counters" )
93
+ def dhcp4relay_counters ():
94
+ """Show DHCPv4 counter"""
95
+ pass
96
+
97
+
98
+ def ipv4_counters (interface ):
99
+ counter = DHCPv4_Counter ()
100
+ counter_intf = counter .get_interface ()
101
+
102
+ if interface :
103
+ print_dhcpv4_count (counter , interface )
104
+ else :
105
+ for intf in counter_intf :
106
+ print_dhcpv4_count (counter , intf )
107
+
108
+
109
+ # 'counts' subcommand ("show dhcp4relay_counters counts")
110
+ @dhcp4relay_counters .command ('counts' )
111
+ @click .option ('-i' , '--interface' , required = False )
112
+ @click .option ('--verbose' , is_flag = True , help = "Enable verbose output" )
113
+ def counts (interface , verbose ):
114
+ """Show dhcp4relay message counts"""
115
+ ipv4_counters (interface )
116
+
40
117
41
118
class DHCPv6_Counter (object ):
42
119
def __init__ (self ):
@@ -46,30 +123,37 @@ def __init__(self):
46
123
47
124
def get_interface (self ):
48
125
""" Get all names of all interfaces in DHCPv6_COUNTER_TABLE """
49
- vlans = []
126
+ interfaces = []
50
127
for key in self .db .keys (self .db .STATE_DB ):
51
128
if DHCPv6_COUNTER_TABLE in key :
52
- vlans .append (key [21 :])
53
- return vlans
129
+ interfaces .append (key [21 :])
130
+ return interfaces
54
131
55
- def get_dhcp6relay_msg_count (self , interface , msg ):
132
+ def get_dhcp6relay_msg_count (self , interface , dir ):
56
133
""" Get count of a dhcp6relay message """
57
- count = self .db .get (self .db .STATE_DB , self .table_name + str (interface ), str (msg ))
58
- data = [str (msg ), count ]
134
+ value = self .db .get (self .db .STATE_DB , self .table_name + str (interface ), str (dir ))
135
+ cnts = ast .literal_eval (str (value ))
136
+ data = []
137
+ if cnts is not None :
138
+ for k , v in cnts .items ():
139
+ data .append ([k , v ])
59
140
return data
60
141
61
142
def clear_table (self , interface ):
62
143
""" Reset all message counts to 0 """
63
- for msg in messages :
64
- self .db .set (self .db .STATE_DB , self .table_name + str (interface ), str (msg ), '0' )
144
+ v6_cnts = {}
145
+ for msg in dhcpv6_messages :
146
+ v6_cnts [msg ] = '0'
147
+ self .db .set (self .db .STATE_DB , self .table_name + str (interface ), str ("RX" ), str (v6_cnts ))
148
+ self .db .set (self .db .STATE_DB , self .table_name + str (interface ), str ("TX" ), str (v6_cnts ))
65
149
66
150
67
- def print_count (counter , intf ):
151
+ def print_dhcpv6_count (counter , intf ):
68
152
"""Print count of each message"""
69
- data = []
70
- for i in messages :
71
- data . append ( counter .get_dhcp6relay_msg_count (intf , i ) )
72
- print (tabulate (data , headers = ["Message Type" , intf ], tablefmt = 'simple' , stralign = 'right' ) + "\n " )
153
+ rx_data = counter . get_dhcp6relay_msg_count ( intf , "RX" )
154
+ print ( tabulate ( rx_data , headers = [ "Message Type" , intf + "(RX)" ], tablefmt = 'simple' , stralign = 'right' ) + " \n " )
155
+ tx_data = counter .get_dhcp6relay_msg_count (intf , "TX" )
156
+ print (tabulate (tx_data , headers = ["Message Type" , intf + "(TX)" ], tablefmt = 'simple' , stralign = 'right' ) + "\n " )
73
157
74
158
75
159
#
@@ -88,10 +172,10 @@ def ipv6_counters(interface):
88
172
counter_intf = counter .get_interface ()
89
173
90
174
if interface :
91
- print_count (counter , interface )
175
+ print_dhcpv6_count (counter , interface )
92
176
else :
93
177
for intf in counter_intf :
94
- print_count (counter , intf )
178
+ print_dhcpv6_count (counter , intf )
95
179
96
180
97
181
# 'counts' subcommand ("show dhcp6relay_counters counts")
@@ -100,7 +184,6 @@ def ipv6_counters(interface):
100
184
@click .option ('--verbose' , is_flag = True , help = "Enable verbose output" )
101
185
def counts (interface , verbose ):
102
186
"""Show dhcp6relay message counts"""
103
-
104
187
ipv6_counters (interface )
105
188
106
189
@@ -199,6 +282,7 @@ def dhcp_relay_ip6counters(interface):
199
282
200
283
201
284
def register (cli ):
285
+ cli .add_command (dhcp4relay_counters )
202
286
cli .add_command (dhcp6relay_counters )
203
287
cli .add_command (dhcp_relay_helper )
204
288
cli .add_command (dhcp_relay )
0 commit comments