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