feat: sample Raspberry Pi primary interface traffic rates
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
"""Sample interface counters without summing physical and virtual interfaces."""
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class NetworkRates:
|
||||
def __init__(self, root='/sys/class/net'):
|
||||
self.root = Path(root)
|
||||
self.previous = None
|
||||
|
||||
def sample(self, interface, now):
|
||||
try:
|
||||
if not re.fullmatch(r'[\w.:-]{1,64}', interface):
|
||||
raise ValueError('invalid interface')
|
||||
directory = self.root / interface / 'statistics'
|
||||
rx = int((directory / 'rx_bytes').read_text())
|
||||
tx = int((directory / 'tx_bytes').read_text())
|
||||
if rx < 0 or tx < 0:
|
||||
raise ValueError('negative counter')
|
||||
except (OSError, ValueError, TypeError):
|
||||
self.previous = None
|
||||
return None, None
|
||||
previous = self.previous
|
||||
self.previous = interface, now, rx, tx
|
||||
if previous is None or previous[0] != interface or now <= previous[1]:
|
||||
return None, None
|
||||
elapsed = now - previous[1]
|
||||
return (None if rx < previous[2] else (rx - previous[2]) / elapsed,
|
||||
None if tx < previous[3] else (tx - previous[3]) / elapsed)
|
||||
@@ -1,11 +1,12 @@
|
||||
#!/usr/bin/env python3
|
||||
import time,socket,subprocess,configparser,signal,re,argparse,json,os,platform
|
||||
from pathlib import Path
|
||||
APP_VERSION="3.7.2"
|
||||
APP_VERSION="3.8.0"
|
||||
import sys
|
||||
sys.path.append("/usr/local/share/pigway-pi-control")
|
||||
from shutil import disk_usage
|
||||
from plugin_api import Publisher,registered,discover
|
||||
from network_rates import NetworkRates
|
||||
|
||||
CFG="/etc/pigway-pi-control.conf"
|
||||
STATUS_PATH="/run/pigway-pi-control/status.json"
|
||||
@@ -104,6 +105,8 @@ prev_cpu=None
|
||||
page=0; page_since=time.monotonic()
|
||||
cpu_hi=mem_hi=0
|
||||
net_ok=link_ok=True
|
||||
network_rates=NetworkRates()
|
||||
net_rx_bytes_per_second=None; net_tx_bytes_per_second=None
|
||||
net_iface=""; net_kind="NET"; net_metric="DOWN"; net_speed_mbps=None; ip_label="IP4"; ip="NO IP"
|
||||
link_failure_since=internet_failure_since=None
|
||||
wifi_weak_since=None; wifi_weak_active=False
|
||||
@@ -435,6 +438,8 @@ def write_status(cpu,temp,mem,disk):
|
||||
"power":health,
|
||||
"network":{"interface":net_iface,"kind":net_kind,"metric":net_metric,
|
||||
"link_speed_mbps":net_speed_mbps,
|
||||
"rx_bytes_per_second":net_rx_bytes_per_second,
|
||||
"tx_bytes_per_second":net_tx_bytes_per_second,
|
||||
"signal_percent":signal,
|
||||
"ip_label":ip_label,"ip":ip,"link":bool(link_ok),"internet":bool(net_ok)},
|
||||
"watches":[{"type":w[0],"name":w[1],"target":w[2],"up":bool(ok)}
|
||||
@@ -484,6 +489,7 @@ try:
|
||||
if now>=monitor_ready_at and now-last_net >= NETWORK_INTERVAL:
|
||||
old_id=(net_iface,ip)
|
||||
net_iface,net_kind,net_metric,net_speed_mbps,ip_label,ip=primary_network()
|
||||
net_rx_bytes_per_second,net_tx_bytes_per_second=network_rates.sample(net_iface,now)
|
||||
raw_link_ok=ip!="NO IP"; raw_net_ok=internet() if raw_link_ok else False
|
||||
if raw_link_ok:
|
||||
link_failure_since=None;link_ok=True
|
||||
|
||||
Reference in New Issue
Block a user