xref: /aosp_15_r20/external/libnl/python/netlink/util.py (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker#
2*4dc78e53SAndroid Build Coastguard Worker# Utilities
3*4dc78e53SAndroid Build Coastguard Worker#
4*4dc78e53SAndroid Build Coastguard Worker# Copyright (c) 2011 Thomas Graf <[email protected]>
5*4dc78e53SAndroid Build Coastguard Worker#
6*4dc78e53SAndroid Build Coastguard Worker
7*4dc78e53SAndroid Build Coastguard Worker"""utility module for netlink
8*4dc78e53SAndroid Build Coastguard Worker
9*4dc78e53SAndroid Build Coastguard Worker"""
10*4dc78e53SAndroid Build Coastguard Worker
11*4dc78e53SAndroid Build Coastguard Workerfrom __future__ import absolute_import
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Workerfrom . import capi as capi
14*4dc78e53SAndroid Build Coastguard Workerfrom string import Formatter
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker__version__ = "1.0"
17*4dc78e53SAndroid Build Coastguard Worker
18*4dc78e53SAndroid Build Coastguard Worker
19*4dc78e53SAndroid Build Coastguard Worker# rename into colored_output
20*4dc78e53SAndroid Build Coastguard Workerdef _color(t, c):
21*4dc78e53SAndroid Build Coastguard Worker    return "{esc}[{color}m{text}{esc}[0m".format(esc=b"\x1b".decode(), color=c, text=t)
22*4dc78e53SAndroid Build Coastguard Worker
23*4dc78e53SAndroid Build Coastguard Worker
24*4dc78e53SAndroid Build Coastguard Workerdef black(t):
25*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 30)
26*4dc78e53SAndroid Build Coastguard Worker
27*4dc78e53SAndroid Build Coastguard Worker
28*4dc78e53SAndroid Build Coastguard Workerdef red(t):
29*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 31)
30*4dc78e53SAndroid Build Coastguard Worker
31*4dc78e53SAndroid Build Coastguard Worker
32*4dc78e53SAndroid Build Coastguard Workerdef green(t):
33*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 32)
34*4dc78e53SAndroid Build Coastguard Worker
35*4dc78e53SAndroid Build Coastguard Worker
36*4dc78e53SAndroid Build Coastguard Workerdef yellow(t):
37*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 33)
38*4dc78e53SAndroid Build Coastguard Worker
39*4dc78e53SAndroid Build Coastguard Worker
40*4dc78e53SAndroid Build Coastguard Workerdef blue(t):
41*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 34)
42*4dc78e53SAndroid Build Coastguard Worker
43*4dc78e53SAndroid Build Coastguard Worker
44*4dc78e53SAndroid Build Coastguard Workerdef magenta(t):
45*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 35)
46*4dc78e53SAndroid Build Coastguard Worker
47*4dc78e53SAndroid Build Coastguard Worker
48*4dc78e53SAndroid Build Coastguard Workerdef cyan(t):
49*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 36)
50*4dc78e53SAndroid Build Coastguard Worker
51*4dc78e53SAndroid Build Coastguard Worker
52*4dc78e53SAndroid Build Coastguard Workerdef white(t):
53*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 37)
54*4dc78e53SAndroid Build Coastguard Worker
55*4dc78e53SAndroid Build Coastguard Worker
56*4dc78e53SAndroid Build Coastguard Workerdef bold(t):
57*4dc78e53SAndroid Build Coastguard Worker    return _color(t, 1)
58*4dc78e53SAndroid Build Coastguard Worker
59*4dc78e53SAndroid Build Coastguard Worker
60*4dc78e53SAndroid Build Coastguard Workerdef kw(t):
61*4dc78e53SAndroid Build Coastguard Worker    return yellow(t)
62*4dc78e53SAndroid Build Coastguard Worker
63*4dc78e53SAndroid Build Coastguard Worker
64*4dc78e53SAndroid Build Coastguard Workerdef num(t):
65*4dc78e53SAndroid Build Coastguard Worker    return str(t)
66*4dc78e53SAndroid Build Coastguard Worker
67*4dc78e53SAndroid Build Coastguard Worker
68*4dc78e53SAndroid Build Coastguard Workerdef string(t):
69*4dc78e53SAndroid Build Coastguard Worker    return t
70*4dc78e53SAndroid Build Coastguard Worker
71*4dc78e53SAndroid Build Coastguard Worker
72*4dc78e53SAndroid Build Coastguard Workerdef addr(t):
73*4dc78e53SAndroid Build Coastguard Worker    return str(t)
74*4dc78e53SAndroid Build Coastguard Worker
75*4dc78e53SAndroid Build Coastguard Worker
76*4dc78e53SAndroid Build Coastguard Workerdef bad(t):
77*4dc78e53SAndroid Build Coastguard Worker    return red(t)
78*4dc78e53SAndroid Build Coastguard Worker
79*4dc78e53SAndroid Build Coastguard Worker
80*4dc78e53SAndroid Build Coastguard Workerdef good(t):
81*4dc78e53SAndroid Build Coastguard Worker    return green(t)
82*4dc78e53SAndroid Build Coastguard Worker
83*4dc78e53SAndroid Build Coastguard Worker
84*4dc78e53SAndroid Build Coastguard Workerdef title(t):
85*4dc78e53SAndroid Build Coastguard Worker    return t
86*4dc78e53SAndroid Build Coastguard Worker
87*4dc78e53SAndroid Build Coastguard Worker
88*4dc78e53SAndroid Build Coastguard Workerdef boolean(t):
89*4dc78e53SAndroid Build Coastguard Worker    return str(t)
90*4dc78e53SAndroid Build Coastguard Worker
91*4dc78e53SAndroid Build Coastguard Worker
92*4dc78e53SAndroid Build Coastguard Workerdef handle(t):
93*4dc78e53SAndroid Build Coastguard Worker    return str(t)
94*4dc78e53SAndroid Build Coastguard Worker
95*4dc78e53SAndroid Build Coastguard Worker
96*4dc78e53SAndroid Build Coastguard Workerclass MyFormatter(Formatter):
97*4dc78e53SAndroid Build Coastguard Worker    def __init__(self, obj, indent=""):
98*4dc78e53SAndroid Build Coastguard Worker        self._obj = obj
99*4dc78e53SAndroid Build Coastguard Worker        self._indent = indent
100*4dc78e53SAndroid Build Coastguard Worker
101*4dc78e53SAndroid Build Coastguard Worker    def _nlattr(self, key):
102*4dc78e53SAndroid Build Coastguard Worker        value = getattr(self._obj.__class__, key)
103*4dc78e53SAndroid Build Coastguard Worker        if not isinstance(value, property):
104*4dc78e53SAndroid Build Coastguard Worker            raise ValueError("Invalid formatting string {0}".format(key))
105*4dc78e53SAndroid Build Coastguard Worker
106*4dc78e53SAndroid Build Coastguard Worker        d = getattr(value.fget, "formatinfo", {})
107*4dc78e53SAndroid Build Coastguard Worker
108*4dc78e53SAndroid Build Coastguard Worker        # value = value.fget() is exactly the same
109*4dc78e53SAndroid Build Coastguard Worker        value = getattr(self._obj, key)
110*4dc78e53SAndroid Build Coastguard Worker
111*4dc78e53SAndroid Build Coastguard Worker        if "fmt" in d:
112*4dc78e53SAndroid Build Coastguard Worker            value = d["fmt"](value)
113*4dc78e53SAndroid Build Coastguard Worker
114*4dc78e53SAndroid Build Coastguard Worker        title_ = d.get("title", None)
115*4dc78e53SAndroid Build Coastguard Worker
116*4dc78e53SAndroid Build Coastguard Worker        return title_, str(value)
117*4dc78e53SAndroid Build Coastguard Worker
118*4dc78e53SAndroid Build Coastguard Worker    def get_value(self, key, args, kwds):
119*4dc78e53SAndroid Build Coastguard Worker        # Let default get_value() handle ints
120*4dc78e53SAndroid Build Coastguard Worker        if not isinstance(key, str):
121*4dc78e53SAndroid Build Coastguard Worker            return Formatter.get_value(self, key, args, kwds)
122*4dc78e53SAndroid Build Coastguard Worker
123*4dc78e53SAndroid Build Coastguard Worker        # HACK, we allow defining strings via fields to allow
124*4dc78e53SAndroid Build Coastguard Worker        # conversions
125*4dc78e53SAndroid Build Coastguard Worker        if key[:2] == "s|":
126*4dc78e53SAndroid Build Coastguard Worker            return key[2:]
127*4dc78e53SAndroid Build Coastguard Worker
128*4dc78e53SAndroid Build Coastguard Worker        if key[:2] == "t|":
129*4dc78e53SAndroid Build Coastguard Worker            # title mode ("TITLE ATTR")
130*4dc78e53SAndroid Build Coastguard Worker            include_title = True
131*4dc78e53SAndroid Build Coastguard Worker        elif key[:2] == "a|":
132*4dc78e53SAndroid Build Coastguard Worker            # plain attribute mode ("ATTR")
133*4dc78e53SAndroid Build Coastguard Worker            include_title = False
134*4dc78e53SAndroid Build Coastguard Worker        else:
135*4dc78e53SAndroid Build Coastguard Worker            # No special field, have default get_value() get it
136*4dc78e53SAndroid Build Coastguard Worker            return Formatter.get_value(self, key, args, kwds)
137*4dc78e53SAndroid Build Coastguard Worker
138*4dc78e53SAndroid Build Coastguard Worker        key = key[2:]
139*4dc78e53SAndroid Build Coastguard Worker        (title_, value) = self._nlattr(key)
140*4dc78e53SAndroid Build Coastguard Worker
141*4dc78e53SAndroid Build Coastguard Worker        if include_title:
142*4dc78e53SAndroid Build Coastguard Worker            if not title_:
143*4dc78e53SAndroid Build Coastguard Worker                title_ = key  # fall back to key as title
144*4dc78e53SAndroid Build Coastguard Worker            value = "{0} {1}".format(kw(title_), value)
145*4dc78e53SAndroid Build Coastguard Worker
146*4dc78e53SAndroid Build Coastguard Worker        return value
147*4dc78e53SAndroid Build Coastguard Worker
148*4dc78e53SAndroid Build Coastguard Worker    def convert_field(self, value, conversion):
149*4dc78e53SAndroid Build Coastguard Worker        if conversion == "r":
150*4dc78e53SAndroid Build Coastguard Worker            return repr(value)
151*4dc78e53SAndroid Build Coastguard Worker        elif conversion == "s":
152*4dc78e53SAndroid Build Coastguard Worker            return str(value)
153*4dc78e53SAndroid Build Coastguard Worker        elif conversion == "k":
154*4dc78e53SAndroid Build Coastguard Worker            return kw(value)
155*4dc78e53SAndroid Build Coastguard Worker        elif conversion == "b":
156*4dc78e53SAndroid Build Coastguard Worker            return bold(value)
157*4dc78e53SAndroid Build Coastguard Worker        elif conversion is None:
158*4dc78e53SAndroid Build Coastguard Worker            return value
159*4dc78e53SAndroid Build Coastguard Worker
160*4dc78e53SAndroid Build Coastguard Worker        raise ValueError("Unknown converion specifier {0!s}".format(conversion))
161*4dc78e53SAndroid Build Coastguard Worker
162*4dc78e53SAndroid Build Coastguard Worker    def nl(self, format_string=""):
163*4dc78e53SAndroid Build Coastguard Worker        return "\n" + self._indent + self.format(format_string)
164*4dc78e53SAndroid Build Coastguard Worker
165*4dc78e53SAndroid Build Coastguard Worker
166*4dc78e53SAndroid Build Coastguard WorkerNL_BYTE_RATE = 0
167*4dc78e53SAndroid Build Coastguard WorkerNL_BIT_RATE = 1
168*4dc78e53SAndroid Build Coastguard Worker
169*4dc78e53SAndroid Build Coastguard Worker
170*4dc78e53SAndroid Build Coastguard Workerclass Rate(object):
171*4dc78e53SAndroid Build Coastguard Worker    def __init__(self, rate, mode=NL_BYTE_RATE):
172*4dc78e53SAndroid Build Coastguard Worker        self._rate = rate
173*4dc78e53SAndroid Build Coastguard Worker        self._mode = mode
174*4dc78e53SAndroid Build Coastguard Worker
175*4dc78e53SAndroid Build Coastguard Worker    def __str__(self):
176*4dc78e53SAndroid Build Coastguard Worker        return capi.nl_rate2str(self._rate, self._mode, 32)[1]
177*4dc78e53SAndroid Build Coastguard Worker
178*4dc78e53SAndroid Build Coastguard Worker    def __int__(self):
179*4dc78e53SAndroid Build Coastguard Worker        return self._rate
180*4dc78e53SAndroid Build Coastguard Worker
181*4dc78e53SAndroid Build Coastguard Worker    def __cmp__(self, other):
182*4dc78e53SAndroid Build Coastguard Worker        return int(self) - int(other)
183*4dc78e53SAndroid Build Coastguard Worker
184*4dc78e53SAndroid Build Coastguard Worker
185*4dc78e53SAndroid Build Coastguard Workerclass Size(object):
186*4dc78e53SAndroid Build Coastguard Worker    def __init__(self, size):
187*4dc78e53SAndroid Build Coastguard Worker        self._size = size
188*4dc78e53SAndroid Build Coastguard Worker
189*4dc78e53SAndroid Build Coastguard Worker    def __str__(self):
190*4dc78e53SAndroid Build Coastguard Worker        return capi.nl_size2str(self._size, 32)[0]
191*4dc78e53SAndroid Build Coastguard Worker
192*4dc78e53SAndroid Build Coastguard Worker    def __int__(self):
193*4dc78e53SAndroid Build Coastguard Worker        return self._size
194*4dc78e53SAndroid Build Coastguard Worker
195*4dc78e53SAndroid Build Coastguard Worker    def __cmp__(self, other):
196*4dc78e53SAndroid Build Coastguard Worker        return int(self) - int(other)
197