1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

nlmanager: Provide option to prevent color output

Ticket: CM-7361
Reviewed By: CCR-
Testing Done: Tested with clag

Certain loggers, most notably the syslog, don't allow non-printable characters
in their output, and so they convert them to a string of printable characters.
For example, the newline character is converted to #012. This results in output
that looks like this:

2016-08-29T18:50:46.263178+00:00 act-5712-08 clagd[21539]: RXed RTM_NEWNEIGH,
length 68, seq 0, pid 0, flags 0x0#012#012  #033[91mNetlink Header#033[0m#012
1: #033[91m0x44000000#033[0m  D...  Length 0x00000044 (68)#012   2:
#033[91m0x1c000000#033[0m  ....  Type 0x001c (28 - RTM_NEWNEIGH), Flags 0x0000
()#012   3: #033[91m0x00000000#033[0m  ....  Sequence Number 0x00000000 (0)#012
4: #033[91m0x00000000#033[0m  ....  Process ID 0x00000000 (0)#012
#033[93mService Header#033[0m#012   5: #033[93m0x07000000#033[0m  ....  Family
0x07 (7)#012   6: #033[93m0x29010000#033[0m  )...  Interface Index 0x00000129
(297)#012   7: #033[93m0x02000000#033[0m  ....  State 0x0002 (2), Flags 0x00,
Type 0x0000 (0)#012  Attributes#012   8: #033[92m0x0a000200#033[0m  ....  Length
0x000a (10) padded to 12, Type 0x0002 (2) NDA_LLADDR#012   9:
#033[92m0x00020000#033[0m  ....  00:02:00:00:00:09#012  10:
#033[92m0x00090000#033[0m  ....  #012  11: #033[94m0x08000900#033[0m  ....
Length 0x0008 (8), Type 0x0009 (9) NDA_MASTER#012  12: #033[94m0x2b010000#033[0m
+...  299#012  13: #033[92m0x14000300#033[0m  ....  Length 0x0014 (20), Type
0x0003 (3) NDA_CACHEINFO#012  14: #033[92m0x00000000#033[0m  ....  0#012  15:
#033[92m0x00000000#033[0m  ....  0#012  16: #033[92m0x00000000#033[0m  ....
0#012  17: #033[92m0x00000000#033[0m  ....  0#012#012Attributes Summary#012{'(
2) NDA_LLADDR': '00:02:00:00:00:09',#012 '( 3) NDA_CACHEINFO': (0, 0, 0, 0),#012
'( 9) NDA_MASTER': 299}

which is rather hard to interpret. So this patch modifes the nlpacket debug
output so that the user can specify whether or not color output should be used
by including an extra, optional parameter when instantiating a NetlinkPacket
object. The default is for color output, just like before this patch. But if
color output is not desired, then no VT100 control sequences will be output. Nor
will there be any newline characters embedded in the output.

The NetlinkManagerWithListener and NetlinkManager classes were also modified to
add the same optional use_color attribute, which defaults to True. Thus when
class members which instantiate NetlinkPacket objects are created the
appropriate value for the use_color attribute will be applied.

I also noticed that the default pid_offset of the NetlinkListener class was 2,
when it should have been 1. So I fixed that too.
This commit is contained in:
Scott Emery
2016-08-29 11:28:52 -07:00
committed by Julien Fortin
parent 9f25ff0dbd
commit a61d1777cd
3 changed files with 100 additions and 63 deletions

View File

@@ -40,7 +40,7 @@ class Sequence(object):
class NetlinkManager(object):
def __init__(self, pid_offset=0):
def __init__(self, pid_offset=0, use_color=True):
# PID_MAX_LIMIT is 2^22 allowing 1024 sockets per-pid. We default to 0
# in the upper space (top 10 bits), which will simply be the PID. Other
# NetlinkManager instantiations in the same process can choose other
@@ -50,6 +50,7 @@ class NetlinkManager(object):
self.shutdown_flag = False
self.ifindexmap = {}
self.tx_socket = None
self.use_color = use_color
# debugs
self.debug = {}
@@ -287,16 +288,16 @@ class NetlinkManager(object):
nle_intr_count = 0
if msgtype == RTM_NEWLINK or msgtype == RTM_DELLINK:
msg = Link(msgtype, nlpacket.debug)
msg = Link(msgtype, nlpacket.debug, use_color=self.use_color)
elif msgtype == RTM_NEWADDR or msgtype == RTM_DELADDR:
msg = Address(msgtype, nlpacket.debug)
msg = Address(msgtype, nlpacket.debug, use_color=self.use_color)
elif msgtype == RTM_NEWNEIGH or msgtype == RTM_DELNEIGH:
msg = Neighbor(msgtype, nlpacket.debug)
msg = Neighbor(msgtype, nlpacket.debug, use_color=self.use_color)
elif msgtype == RTM_NEWROUTE or msgtype == RTM_DELROUTE:
msg = Route(msgtype, nlpacket.debug)
msg = Route(msgtype, nlpacket.debug, use_color=self.use_color)
else:
raise Exception("RXed unknown netlink message type %s" % msgtype)
@@ -326,19 +327,19 @@ class NetlinkManager(object):
"""
if rtm_type == RTM_GETADDR:
msg = Address(rtm_type, debug)
msg = Address(rtm_type, debug, use_color=self.use_color)
msg.body = pack('Bxxxi', family, 0)
elif rtm_type == RTM_GETLINK:
msg = Link(rtm_type, debug)
msg = Link(rtm_type, debug, use_color=self.use_color)
msg.body = pack('Bxxxiii', family, 0, 0, 0)
elif rtm_type == RTM_GETNEIGH:
msg = Neighbor(rtm_type, debug)
msg = Neighbor(rtm_type, debug, use_color=self.use_color)
msg.body = pack('Bxxxii', family, 0, 0)
elif rtm_type == RTM_GETROUTE:
msg = Route(rtm_type, debug)
msg = Route(rtm_type, debug, use_color=self.use_color)
msg.body = pack('Bxxxii', family, 0, 0)
else:
@@ -384,7 +385,7 @@ class NetlinkManager(object):
if routes:
for (afi, ip, mask, nexthop, interface_index) in routes:
route = Route(rtm_command, debug)
route = Route(rtm_command, debug, use_color=self.use_color)
route.flags = NLM_F_REQUEST | NLM_F_CREATE
route.body = pack('BBBBBBBBi', afi, mask, 0, 0, table, protocol,
route_scope, route_type, 0)
@@ -404,7 +405,7 @@ class NetlinkManager(object):
for (route_key, value) in ecmp_routes.iteritems():
(afi, ip, mask) = route_key
route = Route(rtm_command, debug)
route = Route(rtm_command, debug, use_color=self.use_color)
route.flags = NLM_F_REQUEST | NLM_F_CREATE
route.body = pack('BBBBBBBBi', afi, mask, 0, 0, table, protocol,
route_scope, route_type, 0)
@@ -438,7 +439,7 @@ class NetlinkManager(object):
- IPv6Address
"""
# Transmit a RTM_GETROUTE to query for the route we want
route = Route(RTM_GETROUTE, debug)
route = Route(RTM_GETROUTE, debug, use_color=self.use_color)
route.flags = NLM_F_REQUEST | NLM_F_ACK
# Set everything in the service header as 0 other than the afi
@@ -478,7 +479,7 @@ class NetlinkManager(object):
"""
debug = RTM_GETLINK in self.debug
link = Link(RTM_GETLINK, debug)
link = Link(RTM_GETLINK, debug, use_color=self.use_color)
link.flags = NLM_F_REQUEST | NLM_F_ACK
link.body = pack('=Bxxxiii', socket.AF_UNSPEC, 0, 0, 0)
link.add_attribute(Link.IFLA_IFNAME, ifname)
@@ -507,7 +508,7 @@ class NetlinkManager(object):
"""
debug = RTM_NEWLINK in self.debug
link = Link(RTM_NEWLINK, debug)
link = Link(RTM_NEWLINK, debug, use_color=self.use_color)
link.flags = NLM_F_CREATE | NLM_F_REQUEST | NLM_F_ACK
link.body = pack('Bxxxiii', socket.AF_UNSPEC, 0, 0, 0)
link.add_attribute(Link.IFLA_IFNAME, ifname)
@@ -556,7 +557,7 @@ class NetlinkManager(object):
"""
debug = RTM_GETLINK in self.debug
link = Link(RTM_GETLINK, debug)
link = Link(RTM_GETLINK, debug, use_color=self.use_color)
link.flags = NLM_F_DUMP | NLM_F_REQUEST
link.body = pack('Bxxxiii', socket.AF_BRIDGE, 0, 0, 0)
@@ -672,7 +673,7 @@ class NetlinkManager(object):
bridge_flags = 0
vlan_info_flags = 0
link = Link(msgtype, debug)
link = Link(msgtype, debug, use_color=self.use_color)
link.flags = NLM_F_REQUEST | NLM_F_ACK
link.body = pack('Bxxxiii', socket.AF_BRIDGE, ifindex, 0, 0)
@@ -737,7 +738,7 @@ class NetlinkManager(object):
debug = RTM_NEWLINK in self.debug
if_change = Link.IFF_UP
link = Link(RTM_NEWLINK, debug)
link = Link(RTM_NEWLINK, debug, use_color=self.use_color)
link.flags = NLM_F_REQUEST | NLM_F_ACK
link.body = pack('=BxxxiLL', socket.AF_UNSPEC, 0, if_flags, if_change)
link.add_attribute(Link.IFLA_IFNAME, ifname)
@@ -753,7 +754,7 @@ class NetlinkManager(object):
debug = RTM_NEWLINK in self.debug
link = Link(RTM_NEWLINK, debug)
link = Link(RTM_NEWLINK, debug, use_color=self.use_color)
link.flags = NLM_F_REQUEST | NLM_F_ACK
link.body = pack('=BxxxiLL', socket.AF_UNSPEC, 0, 0, 0)
link.add_attribute(Link.IFLA_IFNAME, ifname)
@@ -768,7 +769,7 @@ class NetlinkManager(object):
debug = RTM_NEWNEIGH in self.debug
service_hdr_flags = 0
nbr = Neighbor(RTM_NEWNEIGH, debug)
nbr = Neighbor(RTM_NEWNEIGH, debug, use_color=self.use_color)
nbr.flags = NLM_F_CREATE | NLM_F_REQUEST | NLM_F_ACK
nbr.family = afi
nbr.body = pack('=BxxxiHBB', afi, ifindex, Neighbor.NUD_REACHABLE, service_hdr_flags, Route.RTN_UNICAST)
@@ -781,7 +782,7 @@ class NetlinkManager(object):
debug = RTM_DELNEIGH in self.debug
service_hdr_flags = 0
nbr = Neighbor(RTM_DELNEIGH, debug)
nbr = Neighbor(RTM_DELNEIGH, debug, use_color=self.use_color)
nbr.flags = NLM_F_REQUEST | NLM_F_ACK
nbr.family = afi
nbr.body = pack('=BxxxiHBB', afi, ifindex, Neighbor.NUD_REACHABLE, service_hdr_flags, Route.RTN_UNICAST)
@@ -809,7 +810,7 @@ class NetlinkManager(object):
if ageing:
info_data[Link.IFLA_VXLAN_AGEING] = int(ageing)
link = Link(RTM_NEWLINK, debug)
link = Link(RTM_NEWLINK, debug, use_color=self.use_color)
link.flags = NLM_F_CREATE | NLM_F_REQUEST | NLM_F_ACK
link.body = pack('Bxxxiii', socket.AF_UNSPEC, 0, 0, 0)
link.add_attribute(Link.IFLA_IFNAME, ifname)