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