Nota: sincronización de fichas vendidas
Script del router, scheduler y verificación — todo en un solo lugar
NOTA ÚNICA — Envío de fichas usadas al app (HTTPS vault.isurfx.com)
Todo lo que se instaló, en un solo lugar. Si algún día hay que repetirlo en otro router, se copia de aquí. No usa WireGuard.
1. CUÁL FUE EL QUE SIRVIÓ (respuesta corta)
El que quedó permanente y funcionando en el Router 56 — GUERRERO ITUNDUJIA:
- Script:
isurfx-usage-56→ vive en el Router (System → Scripts) - Scheduler:
isurfx-usage-56cada 5 min → vive en el Router (System → Schedulers) - Archivo de avance:
isurfx-cur.txt→ vive en el Router (Files), lo crea solo - Endpoint destino:
https://vault.isurfx.com/router/usage→ vive en el Vault (HTTPS, fuera de Base44)
Ese es el bueno. Los demás intentos (paste manual de scripts largos, WireGuard,
import de .rsc por file-server, CHR/proxy central) no se usaron.
2. SCRIPT DEL ROUTER (contenido exacto del que quedó)
:local url "https://vault.isurfx.com/router/usage"
:local rid "56"
:local token "<TOKEN_DEL_VAULT>"
:local slice 150
:local cf "isurfx-cur.txt"
:local cursor 0
:if ([:len [/file find name=$cf]] > 0) do={ :set cursor [:tonum [/file get [/file find name=$cf] contents]] }
:local ids [/user-manager/session find]
:local total [:len $ids]
:if ($cursor >= $total) do={ :set cursor 0 }
:local till ($cursor + $slice)
:if ($till > $total) do={ :set till $total }
:local n 0
:local i $cursor
:while ($i < $till) do={
:local r [/user-manager/session get ($ids->$i)]
:local c ($r->"user")
:local u ($r->"uptime")
:local go "no"
:if ([:typeof $c] = "str") do={ :if ([:typeof $u] = "str") do={ :if ([:len $c] > 0) do={ :set go "yes" } } }
:if ($go = "yes") do={ :if ($u = "0s") do={ :set go "no" } }
:if ($go = "yes") do={ :if ($u = "00:00:00") do={ :set go "no" } }
:if ($go = "yes") do={
:do { /tool fetch url=$url http-method=post http-data=("{\"router_id\":\"" . $rid . "\",\"code\":\"" . $c . "\",\"uptime\":\"" . $u . "\"}") http-header-field=("Content-Type: application/json,X-Api-Key:" . $token) check-certificate=no keep-result=no
:set n ($n + 1) } on-error={ :log warning ("isX FAIL " . $c) }
:delay 300ms
}
:set i ($i + 1)
}
:if ([:len [/file find name=$cf]] = 0) do={ /file print file=$cf
:delay 2s }
:do { /file set [/file find name=$cf] contents=$till } on-error={ :log warning "isX sin cursor" }
:log info ("isX lote " . $cursor . "-" . $till . "/" . $total . " enviadas " . $n)
El token (<TOKEN_DEL_VAULT>) es el mismo que ya está guardado en la app como
secreto MIKROTIK_API_TOKEN. No se escribe aquí para que esta nota se pueda
compartir. En el router 56 ya está puesto y funcionando.
3. POR QUÉ ESTE SÍ FUNCIONÓ Y LOS OTROS NO
- Va en lotes de 150 sesiones (≈45 s por corrida) y guarda el avance en
isurfx-cur.txt. Al llegar al final de la tabla vuelve a empezar. → El CPU del RB2011 no se satura (el problema de todos los intentos anteriores era justo ese: el CPU al 100% congelaba WinBox y el router). - Se instala una sola vez; ya no hay que pegar nada a mano cada vez.
- Usa HTTPS directo al vault, sin túnel ni WireGuard.
- La app ignora lo que ya está vendido, así que repetir lotes no duplica ventas.
4. INSTALACIÓN EN UN ROUTER NUEVO (3 pasos)
Paso A — bajar el script ya armado (el app le inyecta solo el router_id y el token):
/tool fetch url="https://isurf-x.base44.app/functions/getUsageScript?router_id=56" check-certificate=no dst-path=isurfx-usage.rsc
(cambiar 56 por el número del router destino)
Paso B — crear el script desde el archivo (nunca pegando código a mano):
/system script add name="isurfx-usage-56" policy=ftp,read,write,policy,test source=[/file get isurfx-usage.rsc contents]
Paso C — crear el scheduler de 5 minutos:
/system scheduler add name="isurfx-usage-56" interval=00:05:00 policy=ftp,read,write,policy,test on-event="isurfx-usage-56"
Si sale
failure: item with this name already exists, es que ya estaba creado — no hay que hacer nada, está bien.
5. CÓMO SE VERIFICA (los 3 comandos que usamos)
/system script print detail where name="isurfx-usage-56"
/system scheduler print detail where name="isurfx-usage-56"
/log print where message~"isX"
Qué mirar:
run-countdebe ir subiendo (si está en 0, todavía no ha corrido).next-rundebe mostrar una hora futura.- En el log debe aparecer:
isX lote 0-150/888 enviadas 150
Si sale isX FAIL <ficha> = esa sesión falló (normalmente por el token o por
una sesión rara). Si salen todas en FAIL = token incorrecto.
6. LO QUE HACE LA APP DE SU LADO
syncVoucherUsageFromPhysicalRouter→ recibe el POST del router, marca la ficha como vendida, suma uso y asigna la venta al subaccount dueño.getUsageScript→ sirve el script ya armado para descargarlo al router (evita pegar código en WinBox).iSurfXwgVoucherHub→ panel admin: publica/repara scripts en el vault y sincroniza lotes de fichas.routerUsageScript(compartido) → la plantilla del script, en un solo lugar.
7. PENDIENTES QUE YA SE CERRARON / QUE QUEDAN
- ✅ Router 56 reportando ventas
- ⏳ Idempotencia: confirmar que reenviar el mismo lote no duplica (la app ya ignora vendidas, solo falta vigilarlo unos días)
- ⏳ Replicar este mismo esquema en los demás routers que todavía no reportan
(ej.
LO DE MEJIA/ Router 26)
