blob: 3adc509bd730b06c0ecbaaa333d1a7698288c218 [file] [log] [blame]
Thomas Graff443be62011-05-10 12:17:33 +02001#
Коренберг Марк (ноутбук дома)b369d222012-06-04 22:55:49 +06002# Utilities
Thomas Graff443be62011-05-10 12:17:33 +02003#
4# Copyright (c) 2011 Thomas Graf <tgraf@suug.ch>
5#
6
7"""utility module for netlink
8
9"""
10
Коренберг Марк (ноутбук дома)4be1ae22012-06-04 22:54:16 +060011from __future__ import absolute_import
12
Коренберг Марк (ноутбук дома)4be1ae22012-06-04 22:54:16 +060013from . import capi as capi
Thomas Graff443be62011-05-10 12:17:33 +020014from string import Formatter
15
Thomas Haller3c753e32023-07-13 09:31:52 +020016__version__ = "1.0"
Thomas Graff443be62011-05-10 12:17:33 +020017
Thomas Hallerd5610962023-07-25 15:50:16 +020018
Thomas Haller3c753e32023-07-13 09:31:52 +020019# rename into colored_output
Thomas Graff443be62011-05-10 12:17:33 +020020def _color(t, c):
Thomas Haller3c753e32023-07-13 09:31:52 +020021 return "{esc}[{color}m{text}{esc}[0m".format(esc=b"\x1b".decode(), color=c, text=t)
22
Thomas Graff443be62011-05-10 12:17:33 +020023
24def black(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060025 return _color(t, 30)
Thomas Graff443be62011-05-10 12:17:33 +020026
Thomas Haller3c753e32023-07-13 09:31:52 +020027
Thomas Graff443be62011-05-10 12:17:33 +020028def red(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060029 return _color(t, 31)
Thomas Graff443be62011-05-10 12:17:33 +020030
Thomas Haller3c753e32023-07-13 09:31:52 +020031
Thomas Graff443be62011-05-10 12:17:33 +020032def green(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060033 return _color(t, 32)
Thomas Graff443be62011-05-10 12:17:33 +020034
Thomas Haller3c753e32023-07-13 09:31:52 +020035
Thomas Graff443be62011-05-10 12:17:33 +020036def yellow(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060037 return _color(t, 33)
Thomas Graff443be62011-05-10 12:17:33 +020038
Thomas Haller3c753e32023-07-13 09:31:52 +020039
Thomas Graff443be62011-05-10 12:17:33 +020040def blue(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060041 return _color(t, 34)
Thomas Graff443be62011-05-10 12:17:33 +020042
Thomas Haller3c753e32023-07-13 09:31:52 +020043
Коренберг Марк (ноутбук дома)f55ea7f2012-06-04 22:52:02 +060044def magenta(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060045 return _color(t, 35)
Thomas Graff443be62011-05-10 12:17:33 +020046
Thomas Haller3c753e32023-07-13 09:31:52 +020047
Thomas Graff443be62011-05-10 12:17:33 +020048def cyan(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060049 return _color(t, 36)
Thomas Graff443be62011-05-10 12:17:33 +020050
Thomas Haller3c753e32023-07-13 09:31:52 +020051
Thomas Graff443be62011-05-10 12:17:33 +020052def white(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060053 return _color(t, 37)
Thomas Graff443be62011-05-10 12:17:33 +020054
Thomas Haller3c753e32023-07-13 09:31:52 +020055
Thomas Graff443be62011-05-10 12:17:33 +020056def bold(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060057 return _color(t, 1)
Thomas Graff443be62011-05-10 12:17:33 +020058
Thomas Haller3c753e32023-07-13 09:31:52 +020059
Thomas Graff443be62011-05-10 12:17:33 +020060def kw(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060061 return yellow(t)
Thomas Graff443be62011-05-10 12:17:33 +020062
Thomas Haller3c753e32023-07-13 09:31:52 +020063
Thomas Graff443be62011-05-10 12:17:33 +020064def num(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060065 return str(t)
Thomas Graff443be62011-05-10 12:17:33 +020066
Thomas Haller3c753e32023-07-13 09:31:52 +020067
Thomas Graff443be62011-05-10 12:17:33 +020068def string(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060069 return t
Thomas Graff443be62011-05-10 12:17:33 +020070
Thomas Haller3c753e32023-07-13 09:31:52 +020071
Thomas Graff443be62011-05-10 12:17:33 +020072def addr(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060073 return str(t)
Thomas Graff443be62011-05-10 12:17:33 +020074
Thomas Haller3c753e32023-07-13 09:31:52 +020075
Thomas Graff443be62011-05-10 12:17:33 +020076def bad(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060077 return red(t)
Thomas Graff443be62011-05-10 12:17:33 +020078
Thomas Haller3c753e32023-07-13 09:31:52 +020079
Thomas Graff443be62011-05-10 12:17:33 +020080def good(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060081 return green(t)
Thomas Graff443be62011-05-10 12:17:33 +020082
Thomas Haller3c753e32023-07-13 09:31:52 +020083
Thomas Graff443be62011-05-10 12:17:33 +020084def title(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060085 return t
Thomas Graff443be62011-05-10 12:17:33 +020086
Thomas Haller3c753e32023-07-13 09:31:52 +020087
Коренберг Марк (ноутбук дома)454ea4a2012-06-06 01:36:05 +060088def boolean(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060089 return str(t)
Thomas Graff443be62011-05-10 12:17:33 +020090
Thomas Haller3c753e32023-07-13 09:31:52 +020091
Thomas Graff443be62011-05-10 12:17:33 +020092def handle(t):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060093 return str(t)
Thomas Graff443be62011-05-10 12:17:33 +020094
Thomas Haller3c753e32023-07-13 09:31:52 +020095
Thomas Graff443be62011-05-10 12:17:33 +020096class MyFormatter(Formatter):
Thomas Haller3c753e32023-07-13 09:31:52 +020097 def __init__(self, obj, indent=""):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +060098 self._obj = obj
99 self._indent = indent
Thomas Graff443be62011-05-10 12:17:33 +0200100
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600101 def _nlattr(self, key):
Коренберг Марк87d37092012-06-07 13:48:06 +0600102 value = getattr(self._obj.__class__, key)
103 if not isinstance(value, property):
Thomas Haller3c753e32023-07-13 09:31:52 +0200104 raise ValueError("Invalid formatting string {0}".format(key))
Коренберг Марк87d37092012-06-07 13:48:06 +0600105
Thomas Haller490ffa02024-07-19 11:32:59 +0200106 d = getattr(value.fget, "formatinfo", {})
Коренберг Марк87d37092012-06-07 13:48:06 +0600107
108 # value = value.fget() is exactly the same
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600109 value = getattr(self._obj, key)
Thomas Graff443be62011-05-10 12:17:33 +0200110
Thomas Haller3c753e32023-07-13 09:31:52 +0200111 if "fmt" in d:
112 value = d["fmt"](value)
Thomas Graff443be62011-05-10 12:17:33 +0200113
Thomas Haller3c753e32023-07-13 09:31:52 +0200114 title_ = d.get("title", None)
Thomas Graff443be62011-05-10 12:17:33 +0200115
Коренберг Марк (ноутбук дома)454ea4a2012-06-06 01:36:05 +0600116 return title_, str(value)
Thomas Graff443be62011-05-10 12:17:33 +0200117
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600118 def get_value(self, key, args, kwds):
119 # Let default get_value() handle ints
120 if not isinstance(key, str):
121 return Formatter.get_value(self, key, args, kwds)
Thomas Graff443be62011-05-10 12:17:33 +0200122
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600123 # HACK, we allow defining strings via fields to allow
124 # conversions
Thomas Haller3c753e32023-07-13 09:31:52 +0200125 if key[:2] == "s|":
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600126 return key[2:]
Thomas Graff443be62011-05-10 12:17:33 +0200127
Thomas Haller3c753e32023-07-13 09:31:52 +0200128 if key[:2] == "t|":
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600129 # title mode ("TITLE ATTR")
130 include_title = True
Thomas Haller3c753e32023-07-13 09:31:52 +0200131 elif key[:2] == "a|":
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600132 # plain attribute mode ("ATTR")
133 include_title = False
134 else:
135 # No special field, have default get_value() get it
136 return Formatter.get_value(self, key, args, kwds)
Thomas Graff443be62011-05-10 12:17:33 +0200137
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600138 key = key[2:]
Коренберг Марк (ноутбук дома)454ea4a2012-06-06 01:36:05 +0600139 (title_, value) = self._nlattr(key)
Thomas Graff443be62011-05-10 12:17:33 +0200140
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600141 if include_title:
Коренберг Марк (ноутбук дома)454ea4a2012-06-06 01:36:05 +0600142 if not title_:
Thomas Haller3c753e32023-07-13 09:31:52 +0200143 title_ = key # fall back to key as title
144 value = "{0} {1}".format(kw(title_), value)
Thomas Graff443be62011-05-10 12:17:33 +0200145
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600146 return value
Thomas Graff443be62011-05-10 12:17:33 +0200147
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600148 def convert_field(self, value, conversion):
Thomas Haller3c753e32023-07-13 09:31:52 +0200149 if conversion == "r":
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600150 return repr(value)
Thomas Haller3c753e32023-07-13 09:31:52 +0200151 elif conversion == "s":
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600152 return str(value)
Thomas Haller3c753e32023-07-13 09:31:52 +0200153 elif conversion == "k":
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600154 return kw(value)
Thomas Haller3c753e32023-07-13 09:31:52 +0200155 elif conversion == "b":
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600156 return bold(value)
157 elif conversion is None:
158 return value
Коренберг Марк (ноутбук дома)b369d222012-06-04 22:55:49 +0600159
Thomas Haller3c753e32023-07-13 09:31:52 +0200160 raise ValueError("Unknown converion specifier {0!s}".format(conversion))
Thomas Graff443be62011-05-10 12:17:33 +0200161
Thomas Haller3c753e32023-07-13 09:31:52 +0200162 def nl(self, format_string=""):
163 return "\n" + self._indent + self.format(format_string)
164
Thomas Grafe56eb062011-06-10 13:55:29 +0200165
166NL_BYTE_RATE = 0
167NL_BIT_RATE = 1
168
Thomas Haller3c753e32023-07-13 09:31:52 +0200169
Thomas Grafe56eb062011-06-10 13:55:29 +0200170class Rate(object):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600171 def __init__(self, rate, mode=NL_BYTE_RATE):
172 self._rate = rate
173 self._mode = mode
Thomas Grafe56eb062011-06-10 13:55:29 +0200174
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600175 def __str__(self):
176 return capi.nl_rate2str(self._rate, self._mode, 32)[1]
Thomas Grafe56eb062011-06-10 13:55:29 +0200177
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600178 def __int__(self):
179 return self._rate
Thomas Grafe56eb062011-06-10 13:55:29 +0200180
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600181 def __cmp__(self, other):
182 return int(self) - int(other)
Thomas Grafe56eb062011-06-10 13:55:29 +0200183
Thomas Haller3c753e32023-07-13 09:31:52 +0200184
Thomas Grafe56eb062011-06-10 13:55:29 +0200185class Size(object):
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600186 def __init__(self, size):
187 self._size = size
Thomas Grafe56eb062011-06-10 13:55:29 +0200188
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600189 def __str__(self):
190 return capi.nl_size2str(self._size, 32)[0]
Thomas Grafe56eb062011-06-10 13:55:29 +0200191
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600192 def __int__(self):
193 return self._size
Thomas Grafe56eb062011-06-10 13:55:29 +0200194
Коренберг Марк (ноутбук дома)83f06bf2012-06-05 01:08:27 +0600195 def __cmp__(self, other):
196 return int(self) - int(other)