collection.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # -*- coding: utf-8 -*-
  2. # Description:
  3. # Author: Ilya Mashchenko (l2isbad)
  4. # SPDX-License-Identifier: GPL-3.0+
  5. import os
  6. PATH = os.getenv('PATH', '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin').split(':')
  7. CHART_BEGIN = 'BEGIN {0} {1}\n'
  8. CHART_CREATE = "CHART {0} '{1}' '{2}' '{3}' '{4}' '{5}' {6} {7} {8}\n"
  9. DIMENSION_CREATE = "DIMENSION '{0}' '{1}' {2} {3} {4} '{5}'\n"
  10. DIMENSION_SET = "SET '{0}' = {1}\n"
  11. def setdefault_values(config, base_dict):
  12. for key, value in base_dict.items():
  13. config.setdefault(key, value)
  14. return config
  15. def run_and_exit(func):
  16. def wrapper(*args, **kwargs):
  17. func(*args, **kwargs)
  18. exit(1)
  19. return wrapper
  20. def on_try_except_finally(on_except=(None, ), on_finally=(None, )):
  21. except_func = on_except[0]
  22. finally_func = on_finally[0]
  23. def decorator(func):
  24. def wrapper(*args, **kwargs):
  25. try:
  26. func(*args, **kwargs)
  27. except Exception:
  28. if except_func:
  29. except_func(*on_except[1:])
  30. finally:
  31. if finally_func:
  32. finally_func(*on_finally[1:])
  33. return wrapper
  34. return decorator
  35. def static_vars(**kwargs):
  36. def decorate(func):
  37. for k in kwargs:
  38. setattr(func, k, kwargs[k])
  39. return func
  40. return decorate
  41. @on_try_except_finally(on_except=(exit, 1))
  42. def safe_print(*msg):
  43. """
  44. :param msg:
  45. :return:
  46. """
  47. print(''.join(msg))
  48. def find_binary(binary):
  49. """
  50. :param binary: <str>
  51. :return:
  52. """
  53. for directory in PATH:
  54. binary_name = '/'.join([directory, binary])
  55. if os.path.isfile(binary_name) and os.access(binary_name, os.X_OK):
  56. return binary_name
  57. return None
  58. def read_last_line(f):
  59. with open(f, 'rb') as opened:
  60. opened.seek(-2, 2)
  61. while opened.read(1) != b'\n':
  62. opened.seek(-2, 1)
  63. if opened.tell() == 0:
  64. break
  65. result = opened.readline()
  66. return result.decode()
  67. class OldVersionCompatibility:
  68. def __init__(self):
  69. self._data_stream = str()
  70. def begin(self, type_id, microseconds=0):
  71. """
  72. :param type_id: <str>
  73. :param microseconds: <str> or <int>: must be a digit
  74. :return:
  75. """
  76. self._data_stream += CHART_BEGIN.format(type_id, microseconds)
  77. def set(self, dim_id, value):
  78. """
  79. :param dim_id: <str>
  80. :param value: <int> or <str>: must be a digit
  81. :return:
  82. """
  83. self._data_stream += DIMENSION_SET.format(dim_id, value)
  84. def end(self):
  85. self._data_stream += 'END\n'
  86. def chart(self, type_id, name='', title='', units='', family='', category='', chart_type='line',
  87. priority='', update_every=''):
  88. """
  89. :param type_id: <str>
  90. :param name: <str>
  91. :param title: <str>
  92. :param units: <str>
  93. :param family: <str>
  94. :param category: <str>
  95. :param chart_type: <str>
  96. :param priority: <str> or <int>
  97. :param update_every: <str> or <int>
  98. :return:
  99. """
  100. self._data_stream += CHART_CREATE.format(type_id, name, title, units,
  101. family, category, chart_type,
  102. priority, update_every)
  103. def dimension(self, dim_id, name=None, algorithm="absolute", multiplier=1, divisor=1, hidden=False):
  104. """
  105. :param dim_id: <str>
  106. :param name: <str> or None
  107. :param algorithm: <str>
  108. :param multiplier: <str> or <int>: must be a digit
  109. :param divisor: <str> or <int>: must be a digit
  110. :param hidden: <str>: literally "hidden" or ""
  111. :return:
  112. """
  113. self._data_stream += DIMENSION_CREATE.format(dim_id, name or dim_id, algorithm,
  114. multiplier, divisor, hidden or str())
  115. @on_try_except_finally(on_except=(exit, 1))
  116. def commit(self):
  117. print(self._data_stream)
  118. self._data_stream = str()