Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 1 | # |
Коренберг Марк (ноутбук дома) | b369d22 | 2012-06-04 22:55:49 +0600 | [diff] [blame] | 2 | # Utilities |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 3 | # |
| 4 | # Copyright (c) 2011 Thomas Graf <tgraf@suug.ch> |
| 5 | # |
| 6 | |
| 7 | """utility module for netlink |
| 8 | |
| 9 | """ |
| 10 | |
Коренберг Марк (ноутбук дома) | 4be1ae2 | 2012-06-04 22:54:16 +0600 | [diff] [blame] | 11 | from __future__ import absolute_import |
| 12 | |
Коренберг Марк (ноутбук дома) | 4be1ae2 | 2012-06-04 22:54:16 +0600 | [diff] [blame] | 13 | from . import capi as capi |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 14 | from string import Formatter |
| 15 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 16 | __version__ = "1.0" |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 17 | |
Thomas Haller | d561096 | 2023-07-25 15:50:16 +0200 | [diff] [blame] | 18 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 19 | # rename into colored_output |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 20 | def _color(t, c): |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 21 | return "{esc}[{color}m{text}{esc}[0m".format(esc=b"\x1b".decode(), color=c, text=t) |
| 22 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 23 | |
| 24 | def black(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 25 | return _color(t, 30) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 26 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 27 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 28 | def red(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 29 | return _color(t, 31) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 30 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 31 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 32 | def green(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 33 | return _color(t, 32) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 34 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 35 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 36 | def yellow(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 37 | return _color(t, 33) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 38 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 39 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 40 | def blue(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 41 | return _color(t, 34) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 42 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 43 | |
Коренберг Марк (ноутбук дома) | f55ea7f | 2012-06-04 22:52:02 +0600 | [diff] [blame] | 44 | def magenta(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 45 | return _color(t, 35) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 46 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 47 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 48 | def cyan(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 49 | return _color(t, 36) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 50 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 51 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 52 | def white(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 53 | return _color(t, 37) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 54 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 55 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 56 | def bold(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 57 | return _color(t, 1) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 58 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 59 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 60 | def kw(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 61 | return yellow(t) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 62 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 63 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 64 | def num(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 65 | return str(t) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 66 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 67 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 68 | def string(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 69 | return t |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 70 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 71 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 72 | def addr(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 73 | return str(t) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 74 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 75 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 76 | def bad(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 77 | return red(t) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 78 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 79 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 80 | def good(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 81 | return green(t) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 82 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 83 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 84 | def title(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 85 | return t |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 86 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 87 | |
Коренберг Марк (ноутбук дома) | 454ea4a | 2012-06-06 01:36:05 +0600 | [diff] [blame] | 88 | def boolean(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 89 | return str(t) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 90 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 91 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 92 | def handle(t): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 93 | return str(t) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 94 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 95 | |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 96 | class MyFormatter(Formatter): |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 97 | def __init__(self, obj, indent=""): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 98 | self._obj = obj |
| 99 | self._indent = indent |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 100 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 101 | def _nlattr(self, key): |
Коренберг Марк | 87d3709 | 2012-06-07 13:48:06 +0600 | [diff] [blame] | 102 | value = getattr(self._obj.__class__, key) |
| 103 | if not isinstance(value, property): |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 104 | raise ValueError("Invalid formatting string {0}".format(key)) |
Коренберг Марк | 87d3709 | 2012-06-07 13:48:06 +0600 | [diff] [blame] | 105 | |
Thomas Haller | 490ffa0 | 2024-07-19 11:32:59 +0200 | [diff] [blame] | 106 | d = getattr(value.fget, "formatinfo", {}) |
Коренберг Марк | 87d3709 | 2012-06-07 13:48:06 +0600 | [diff] [blame] | 107 | |
| 108 | # value = value.fget() is exactly the same |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 109 | value = getattr(self._obj, key) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 110 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 111 | if "fmt" in d: |
| 112 | value = d["fmt"](value) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 113 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 114 | title_ = d.get("title", None) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 115 | |
Коренберг Марк (ноутбук дома) | 454ea4a | 2012-06-06 01:36:05 +0600 | [diff] [blame] | 116 | return title_, str(value) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 117 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 118 | 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 Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 122 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 123 | # HACK, we allow defining strings via fields to allow |
| 124 | # conversions |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 125 | if key[:2] == "s|": |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 126 | return key[2:] |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 127 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 128 | if key[:2] == "t|": |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 129 | # title mode ("TITLE ATTR") |
| 130 | include_title = True |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 131 | elif key[:2] == "a|": |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 132 | # 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 Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 137 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 138 | key = key[2:] |
Коренберг Марк (ноутбук дома) | 454ea4a | 2012-06-06 01:36:05 +0600 | [diff] [blame] | 139 | (title_, value) = self._nlattr(key) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 140 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 141 | if include_title: |
Коренберг Марк (ноутбук дома) | 454ea4a | 2012-06-06 01:36:05 +0600 | [diff] [blame] | 142 | if not title_: |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 143 | title_ = key # fall back to key as title |
| 144 | value = "{0} {1}".format(kw(title_), value) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 145 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 146 | return value |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 147 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 148 | def convert_field(self, value, conversion): |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 149 | if conversion == "r": |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 150 | return repr(value) |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 151 | elif conversion == "s": |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 152 | return str(value) |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 153 | elif conversion == "k": |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 154 | return kw(value) |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 155 | elif conversion == "b": |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 156 | return bold(value) |
| 157 | elif conversion is None: |
| 158 | return value |
Коренберг Марк (ноутбук дома) | b369d22 | 2012-06-04 22:55:49 +0600 | [diff] [blame] | 159 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 160 | raise ValueError("Unknown converion specifier {0!s}".format(conversion)) |
Thomas Graf | f443be6 | 2011-05-10 12:17:33 +0200 | [diff] [blame] | 161 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 162 | def nl(self, format_string=""): |
| 163 | return "\n" + self._indent + self.format(format_string) |
| 164 | |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 165 | |
| 166 | NL_BYTE_RATE = 0 |
| 167 | NL_BIT_RATE = 1 |
| 168 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 169 | |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 170 | class Rate(object): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 171 | def __init__(self, rate, mode=NL_BYTE_RATE): |
| 172 | self._rate = rate |
| 173 | self._mode = mode |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 174 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 175 | def __str__(self): |
| 176 | return capi.nl_rate2str(self._rate, self._mode, 32)[1] |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 177 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 178 | def __int__(self): |
| 179 | return self._rate |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 180 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 181 | def __cmp__(self, other): |
| 182 | return int(self) - int(other) |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 183 | |
Thomas Haller | 3c753e3 | 2023-07-13 09:31:52 +0200 | [diff] [blame] | 184 | |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 185 | class Size(object): |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 186 | def __init__(self, size): |
| 187 | self._size = size |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 188 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 189 | def __str__(self): |
| 190 | return capi.nl_size2str(self._size, 32)[0] |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 191 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 192 | def __int__(self): |
| 193 | return self._size |
Thomas Graf | e56eb06 | 2011-06-10 13:55:29 +0200 | [diff] [blame] | 194 | |
Коренберг Марк (ноутбук дома) | 83f06bf | 2012-06-05 01:08:27 +0600 | [diff] [blame] | 195 | def __cmp__(self, other): |
| 196 | return int(self) - int(other) |