120 lines
3.5 KiB
Python
Executable File
120 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
import json
|
|
import os
|
|
from time import time
|
|
|
|
# Ruta del archivo temporal para almacenar los bytes previos
|
|
TEMP_FILE = "/tmp/network_speed.json"
|
|
|
|
|
|
def get_bytes(iface):
|
|
try:
|
|
with open("/proc/net/dev", "r") as f:
|
|
for line in f:
|
|
if iface + ":" in line:
|
|
parts = line.split()
|
|
rx_bytes = int(parts[1])
|
|
tx_bytes = int(parts[9])
|
|
return rx_bytes, tx_bytes
|
|
except Exception as e:
|
|
print(json.dumps({
|
|
"text": "Error",
|
|
"tooltip": f"Error al leer /proc/net/dev: {e}",
|
|
"class": "network-speed-error"
|
|
}))
|
|
sys.exit(1)
|
|
print(json.dumps({
|
|
"text": "Interfaz no encontrada",
|
|
"tooltip": f"La interfaz '{iface}' no se encontró en /proc/net/dev.",
|
|
"class": "network-speed-error"
|
|
}))
|
|
sys.exit(1)
|
|
|
|
|
|
def format_speed(speed_bytes):
|
|
if speed_bytes >= 1024 * 1024:
|
|
return f"{speed_bytes / (1024 * 1024):.2f} MB/s"
|
|
elif speed_bytes >= 1024:
|
|
return f"{speed_bytes / 1024:.2f} KB/s"
|
|
else:
|
|
return f"{speed_bytes:.2f} B/s"
|
|
|
|
|
|
def main(iface, interval=1):
|
|
current_time = time()
|
|
data = get_bytes(iface)
|
|
|
|
if data is None:
|
|
error_message = "Datos de bytes no disponibles."
|
|
print(json.dumps({
|
|
"text": "Error",
|
|
"tooltip": error_message,
|
|
"class": "network-speed-error"
|
|
}))
|
|
sys.exit(1)
|
|
|
|
curr_rx, curr_tx = data
|
|
|
|
if os.path.exists(TEMP_FILE):
|
|
try:
|
|
with open(TEMP_FILE, "r") as f:
|
|
prev_data = json.load(f)
|
|
prev_time = prev_data.get("time", current_time)
|
|
prev_rx = prev_data.get("rx_bytes", curr_rx)
|
|
prev_tx = prev_data.get("tx_bytes", curr_tx)
|
|
except Exception as e:
|
|
print(json.dumps({
|
|
"text": "Error",
|
|
"tooltip": f"Error al leer el archivo temporal: {e}",
|
|
"class": "network-speed-error"
|
|
}))
|
|
prev_time, prev_rx, prev_tx = current_time, curr_rx, curr_tx
|
|
else:
|
|
prev_time, prev_rx, prev_tx = current_time, curr_rx, curr_tx
|
|
|
|
delta_time = current_time - prev_time if current_time - prev_time > 0 else interval
|
|
delta_rx = (curr_rx - prev_rx) / delta_time
|
|
delta_tx = (curr_tx - prev_tx) / delta_time
|
|
|
|
rx_speed = format_speed(delta_rx)
|
|
tx_speed = format_speed(delta_tx)
|
|
|
|
# Actualizar el archivo temporal con los valores actuales
|
|
try:
|
|
with open(TEMP_FILE, "w") as f:
|
|
json.dump({
|
|
"time": current_time,
|
|
"rx_bytes": curr_rx,
|
|
"tx_bytes": curr_tx
|
|
}, f)
|
|
except Exception as e:
|
|
print(json.dumps({
|
|
"text": "Error",
|
|
"tooltip": f"Error al escribir el archivo temporal: {e}",
|
|
"class": "network-speed-error"
|
|
}))
|
|
sys.exit(1)
|
|
|
|
# Crear el objeto JSON para Waybar
|
|
data_output = {
|
|
"text": f"↓ {rx_speed} ↑ {tx_speed}",
|
|
"tooltip": f"Velocidad de descarga: {rx_speed}\nVelocidad de subida: {tx_speed}",
|
|
"class": "network-speed"
|
|
}
|
|
|
|
print(json.dumps(data_output))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) < 2:
|
|
print(json.dumps({
|
|
"text": "Uso: network_speed.py <interfaz>",
|
|
"tooltip": "Proporciona el nombre de la interfaz de red, por ejemplo: enp3s0",
|
|
"class": "network-speed-error"
|
|
}))
|
|
sys.exit(1)
|
|
iface = sys.argv[1]
|
|
main(iface)
|