sysinfo.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # -*- coding: utf-8 -*-
  2. """System information utilities."""
  3. import os
  4. from collections import namedtuple
  5. from math import ceil
  6. from kombu.utils.objects import cached_property
  7. __all__ = ['load_average', 'load_average_t', 'df']
  8. load_average_t = namedtuple('load_average_t', (
  9. 'min_1', 'min_5', 'min_15',
  10. ))
  11. def _avg(f: float) -> float:
  12. return ceil(f * 1e2) / 1e2
  13. if hasattr(os, 'getloadavg'):
  14. def load_average() -> load_average_t:
  15. min_1, min_5, min_15 = os.getloadavg()
  16. return load_average_t(_avg(min_1), _avg(min_5), _avg(min_15))
  17. else: # pragma: no cover
  18. # Windows doesn't have getloadavg
  19. def load_average() -> load_average_t: # noqa
  20. return load_average_t(0.0, 0.0, 0.0)
  21. class df:
  22. def __init__(self, path: str) -> None:
  23. self.path = path
  24. @property
  25. def total_blocks(self) -> float:
  26. return self.stat.f_blocks * self.stat.f_frsize / 1024
  27. @property
  28. def available(self) -> float:
  29. return self.stat.f_bavail * self.stat.f_frsize / 1024
  30. @property
  31. def capacity(self) -> int:
  32. avail = self.stat.f_bavail
  33. used = self.stat.f_blocks - self.stat.f_bfree
  34. return int(ceil(used * 100.0 / (used + avail) + 0.5))
  35. @cached_property
  36. def stat(self) -> os.statvfs_result:
  37. return os.statvfs(os.path.abspath(self.path))