blob: c65da5abc40aaf931d6019cf9f461122aaed9059 [file] [log] [blame] [edit]
"""Utility functions for querying CPU, memory, disk, etc."""
from __future__ import absolute_import
import os
NET_DIRECTION_RX = 0
NET_DIRECTION_TX = 1
_NET_STAT_ROOT = '/sys/class/net/'
_NET_STAT_BYTES = {
NET_DIRECTION_RX: 'rx_bytes',
NET_DIRECTION_TX: 'tx_bytes'
}
def get_free_disk_fraction(directory=None):
"""Returns free disk space. From 0.0 (disk is full) to 1.0 (disk is empty)."""
if not directory:
directory = os.getcwd()
statvfs = os.statvfs(directory)
return float(statvfs.f_bavail) / float(statvfs.f_blocks)
def get_network_if():
"""Returns list of network interfaces on host."""
try:
return [net_if for net_if in os.listdir(_NET_STAT_ROOT) if net_if != 'lo']
except OSError:
return []
def get_current_directional_traffic(if_list=None, direction=NET_DIRECTION_RX):
"""Returns current network interfaces directional statistic in bytes."""
if not if_list:
if_list = get_network_if()
bytes_count = 0
for net_if in if_list:
stat_path = os.path.join(
_NET_STAT_ROOT, net_if, 'statistics', _NET_STAT_BYTES[direction])
try:
with open(stat_path) as stat:
bytes_count += int(stat.read())
except OSError:
pass
return bytes_count
def get_current_total_traffic(if_list=None):
"""Returns current rx, tx and total network interfaces statistic in bytes."""
rx_bytes = get_current_directional_traffic(if_list, NET_DIRECTION_RX)
tx_bytes = get_current_directional_traffic(if_list, NET_DIRECTION_TX)
return rx_bytes, tx_bytes, rx_bytes + tx_bytes