06-sep: [parental] fijar_bloqueos lectura-escritura unica: bloqueos seguidos no se pisan
This commit is contained in:
@@ -132,6 +132,60 @@ def _mac_en_vivo(pistas):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _leer_reglas():
|
||||||
|
"""Lee las reglas parentales del router como dict mac -> campos."""
|
||||||
|
from router_control import _run
|
||||||
|
|
||||||
|
def get(var):
|
||||||
|
out = _run(f"nvram get {var}")
|
||||||
|
if out.startswith("Error"):
|
||||||
|
raise RuntimeError(out)
|
||||||
|
return out
|
||||||
|
|
||||||
|
macs = [x for x in get("MULTIFILTER_MAC").split(">") if x]
|
||||||
|
names = get("MULTIFILTER_DEVICENAME").split(">")
|
||||||
|
maps = get("MULTIFILTER_MACFILTER_DAYTIME_V2").split(">")
|
||||||
|
types = get("MULTIFILTER_ENABLE").split(">")
|
||||||
|
reglas = {}
|
||||||
|
for i, mac in enumerate(macs):
|
||||||
|
reglas[mac.upper()] = {
|
||||||
|
"name": names[i] if i < len(names) else "",
|
||||||
|
"timemap": maps[i] if i < len(maps) else TIMEMAP_24_7,
|
||||||
|
"type": types[i] if i < len(types) else "2",
|
||||||
|
}
|
||||||
|
return reglas
|
||||||
|
|
||||||
|
|
||||||
|
def fijar_bloqueos(cambios):
|
||||||
|
"""Aplica varios (mac, name, blocked) con una sola lectura-modificacion-
|
||||||
|
escritura: varios bloqueos seguidos no se pisan entre si."""
|
||||||
|
from router_control import _run
|
||||||
|
import shlex
|
||||||
|
reglas = _leer_reglas()
|
||||||
|
for mac, name, blocked in cambios:
|
||||||
|
mac = (mac or "").upper()
|
||||||
|
if not mac:
|
||||||
|
continue
|
||||||
|
if blocked:
|
||||||
|
reglas[mac] = {"name": name or "", "timemap": TIMEMAP_24_7,
|
||||||
|
"type": "2"}
|
||||||
|
else:
|
||||||
|
reglas.pop(mac, None)
|
||||||
|
orden = list(reglas)
|
||||||
|
cmds = [
|
||||||
|
f"nvram set MULTIFILTER_MAC={shlex.quote('>'.join(orden))}",
|
||||||
|
"nvram set MULTIFILTER_DEVICENAME=" + shlex.quote(
|
||||||
|
">".join(reglas[m]["name"] for m in orden)),
|
||||||
|
"nvram set MULTIFILTER_MACFILTER_DAYTIME_V2=" + shlex.quote(
|
||||||
|
">".join(reglas[m]["timemap"] for m in orden)),
|
||||||
|
f"nvram set MULTIFILTER_ENABLE={shlex.quote('>'.join(reglas[m]['type'] for m in orden))}",
|
||||||
|
"nvram commit",
|
||||||
|
"service restart_firewall",
|
||||||
|
]
|
||||||
|
_run("; ".join(cmds))
|
||||||
|
return _leer_reglas()
|
||||||
|
|
||||||
|
|
||||||
def cambiar_bloqueo(nombre, blocked):
|
def cambiar_bloqueo(nombre, blocked):
|
||||||
device = resolver_dispositivo(nombre)
|
device = resolver_dispositivo(nombre)
|
||||||
if not device:
|
if not device:
|
||||||
@@ -143,8 +197,14 @@ def cambiar_bloqueo(nombre, blocked):
|
|||||||
if vivo and vivo[1].upper() != mac.upper():
|
if vivo and vivo[1].upper() != mac.upper():
|
||||||
mac = vivo[1]
|
mac = vivo[1]
|
||||||
etiqueta = f"{etiqueta} [{vivo[2]} {vivo[0]}]"
|
etiqueta = f"{etiqueta} [{vivo[2]} {vivo[0]}]"
|
||||||
asyncio.run(_set_block(mac, device["name"], blocked))
|
try:
|
||||||
base = f"{'Bloqueado' if blocked else 'Activado'}: {etiqueta} ({mac})"
|
reglas = fijar_bloqueos([(mac, device["name"], blocked)])
|
||||||
|
except Exception as e:
|
||||||
|
return f"❌ No se pudo aplicar la regla: {e}"
|
||||||
|
dentro = mac.upper() in reglas if blocked else mac.upper() not in reglas
|
||||||
|
marca = "✅" if dentro else "❌"
|
||||||
|
base = (f"{'Bloqueado' if blocked else 'Activado'}: {etiqueta} "
|
||||||
|
f"({mac}) {marca}")
|
||||||
try:
|
try:
|
||||||
from router_control import bloqueo_red
|
from router_control import bloqueo_red
|
||||||
return f"{base}\n{bloqueo_red(nombre, mac, blocked)}"
|
return f"{base}\n{bloqueo_red(nombre, mac, blocked)}"
|
||||||
|
|||||||
Reference in New Issue
Block a user