ASN

SQL Detected Guest 3 Views Size: 392.40 KB Posted on: Jun 24, 26 @ 11:27 PM
  1. 1; =========================
  2. 2; ASN ISP / ASN ADDON
  3. 3; Build actual:
  4. 4; ASN_ULTRASAFE_BALANCEDSHED_ASNFAST_TRACE_DIRECT136_IPINFO_HTTPS_UTF8_2026_06_24
  5. 5;
  6. 6; =========================
  7. 7;
  8. 8; INDICE RAPIDO DE COMANDOS / ALIAS VISIBLES
  9. 9;
  10. 10; /barna -> Abre el panel grafico del addon.
  11. 11; /barna.init -> Inicializa/reasegura timers principales.
  12. 12; /barna.postupdate -> Limpia estado temporal de cambio de build y ejecuta /barna.init.
  13. 13; /barna.lagflush -> Limpieza anti-lag fuerte de temporales SIN tocar canales/ASN.
  14. 14; /barna.reload -> Alias de /barna.postupdate.
  15. 15; /barna.qstatus -> Estado de colas, ASN, WHOIP, SAQUIT, sockets y timers.
  16. 16; /barna.varstatus -> Conteo de variables internas del addon.
  17. 17; /barna.stats -> Muestra metricas rapidas: cache ASN/ISP, lookup, qry, WHOIP, sockets, pending, qstate y guardias.
  18. 18; /barna.whoiprescuestatus -> Estado del rescate ligero de WHOIP/lookup atascados.
  19. 19; /barna.whoiprescueclean -> Limpia marcas recientes del rescate WHOIP sin tocar canales/ASN.
  20. 20; /barna.autoscanstatus -> Estado del AUTONICKSCAN. En build 114 queda desactivado por politica JOINONLY.
  21. 21; /barna.autoscanclean -> Limpia marcas/posicion antiguas del AUTONICKSCAN sin tocar canales/ASN.
  22. 22; /barna.joindelayclean -> Limpia solo JOIN_DELAY pendiente si se queda acumulado, sin tocar canales/ASN.
  23. 23; /barna.useriprescuestatus -> Alias conservado por compatibilidad.
  24. 24; /barna.useriprescueclean -> Alias conservado por compatibilidad.
  25. 25; /barna.jguardstatus -> Estado del watchdog ligero de JOIN.
  26. 26; /barna.jguardclean -> Limpia estado temporal JOINGUARD.
  27. 27; /barna.seenguardstatus -> Estado del rescate ligero de nicks vistos sin consulta.
  28. 28; /barna.seenguardclean -> Limpia marcas recientes del SEENGUARD.
  29. 29; /barna.trace <nick> -> Traza de un nick: canales, IP, cache, cola, estado ASN y SEENGUARD.
  30. 30; /barna.recheck <nick> -> Fuerza nueva comprobacion WHOIP/ASN del nick.
  31. 31; /barna.userip <nick> -> Fuerza WHOIP manual del nick. Alias conservado por compatibilidad.
  32. 32; /asn <ip> -> Consulta ASN/ISP manual de una IP.
  33. 33; /asn.nick <nick> -> Consulta ASN/ISP manual a partir de un nick.
  34. 34; /barna.lagmode -> Aplica modo anti-lag equilibrado.
  35. 35; /barna.suave -> Aplica modo suave/conservador.
  36. 36; /barna.canalgrande -> Aplica modo para canales grandes.
  37. 37; /barna.joinfixgc.run -> Limpia restos JOINFIX.
  38. 38; /barna.joinfixgc.on -> Activa timer barna_joinfix_gc.
  39. 39; /barna.joinfixgc.off -> Desactiva timer barna_joinfix_gc.
  40. 40; /barna.ghostfix -> Limpia estado ASN fantasma ligero.
  41. 41; /barna.socktogc -> Apaga timers BarnaSockTO_* huerfanos.
  42. 42; /barna.sockvarclean -> Limpia variables sock/rx/asn_done antiguas si no hay sockets activos.
  43. 43; /barna.ipkeepclean -> Limpia cache ligera de IP por nick usada para trazas y Parseline2.
  44. 44; /barna.saquitfix -> Repara cola SAQUIT descuadrada.
  45. 45; /barna.saquitdrain -> Procesa un lote de SAQUIT vencidos sin congelar mIRC.
  46. 46; /barna.asnbackup -> Guarda backup persistente de canales activos y ASN por canal.
  47. 47; /barna.asnrestore -> Restaura canales activos y ASN por canal desde backup.
  48. 48; /barna.cachereset -> Borra cache ASN exacta por IP.
  49. 49; /barna.cacheclean -> Alias de /barna.cachereset.
  50. 50; /barna.cachecap117.status -> Muestra estado del cap ligero de cache ASN/ISP/TS.
  51. 51; /barna.cachecap117.run -> Ejecuta UN lote pequeño de recorte de cache, sin borrado masivo.
  52. 52; /barna.cachecap117.drain -> Activa drenaje por timer en lotes pequeños hasta volver bajo el limite.
  53. 53; /barna.cachecap117.off -> Desactiva solo el cap automatico 117 y su timer de drenaje.
  54. 54; /barna.pfxreset -> Borra prefijos malos badpfx2/badpfx3. Usar con cuidado.
  55. 55; /barna.pfxprune [#canal] -> Elimina prefijos sin ASN propietario activo; sin canal revisa todos.
  56. 56; /barna.pfxstatus [#canal] [IP] -> Muestra patrones, ASN propietarios activos y prueba coincidencia opcional.
  57. 57; /barna.qreset -> Limpieza fuerte de colas temporales. Usar con cuidado.
  58. 58; /barna.varclean -> Limpieza segura/amplia de variables voluminosas.
  59. 59; /barna.lagclean -> Limpieza de emergencia anti-lag sin tocar canales ni ASN.
  60. 60; /barna.treset -> Apaga timers del addon. Despues usar /barna.init.
  61. 61; /barna.fullreset -> Reset completo conservando canales/ASN configurados.
  62. 62; /barna.cleanstart -> Alias de /barna.fullreset.
  63. 63; /barna.asnkick <nick> -> Sancion manual/test sobre un nick. Usar con cuidado.
  64. 64;
  65. 65; Cambios build 63:
  66. 66; - Añadido /barna.stats.
  67. 67; - Añadido /barna.stats al help/cabecera inicial.
  68. 68; - No se toca flujo WHOIP/SEENGUARD/IPASNRESCUE/ASN.
  69. 69;
  70. 70; Comandos internos *barna**:
  71. 71; No ejecutarlos manualmente salvo indicacion expresa.
  72. 72;
  73. 73; Timers permanentes esperados:
  74. 74; BarnaCoreTick, BarnaASNPump, BarnaMaintenance, barna_joinfix_gc
  75. 75;
  76. 76; Timers temporales normales:
  77. 77; BarnaUserIPBatch, BarnaSAQUITPump, BarnaSockTO_*
  78. 78;
  79. 79; NOTAS IMPORTANTES:
  80. 80; - No usar /timers off global.
  81. 81; - El comando correcto de recheck es /barna.recheck <nick>.
  82. 82; - Build 32: anade /barna.asnbackup y /barna.asnrestore.
  83. 83; - Build 36: anade /barna.lagclean y GC automatico de badpfx/seen/SAQUIT pesado.
  84. 84; - Build 37: anade GC de %barna_last_ip.*, %barna_lookup_chans.*, %barna_lookup.*, %barna_qry.*, %barna_ipdone.* para evitar lag por joins masivos.
  85. 85; - Build 43: anade GC de %barna_sock_*, %barna_sock.*, %barna_rx.* y %barna_asn_done.* para evitar lag por restos de sockets ASN.
  86. 86; - Build 51: anade %barna_ip_keep.* para conservar IP por nick aunque LOOKCLEAN limpie last_ip. Se usa en /barna.trace y @Parseline2.
  87. 87; - Build 52: anade LOOKIDLEGC: si USERIP esta idle, limpia lookup/last_ip automaticamente conservando ip_keep.
  88. 88; - Build 53: acota ip_keep: TTL 600s y max 700 vars; GC automatico para evitar lag por IP persistente.
  89. 89; - Build 54: anade JOINGUARD ultraligero: reintenta USERIP una vez si un JOIN en canal activo no termina en lookup/IP/ASN. Capado para no crear lag.
  90. 90; - Build 55: JOINGUARD_RESCUEFIX: no considera USERIP enviado/lookup pendiente como resultado final; si queda sin IP/ASN, reencola una vez al expirar el guard.
  91. 91; - Build 56: JGUARDGC: limpia restos %barna_jguard* cuando items=0 y el timer esta apagado, sin tocar canales/ASN.
  92. 92; - Build 57: JGUARDWAKE: si hay items reales y el timer esta OFF, lo reactiva automaticamente.
  93. 93; - Build 58: JGUARDTRIM: limpia variables huerfanas de JOINGUARD conservando solo items reales.
  94. 94; - Build 59: JGUARDREBUILD: reconstruye JOINGUARD desde items reales si vars queda alto, sin tocar canales/ASN.
  95. 95; - Build 60: SEENGUARD_NOMISS: escaneo ligero de %barna_seen.* para rescatar nicks vistos sin consulta activa, sin crear cola masiva.
  96. 96; - Build 61: TRACE_SEENGUARD: /barna.trace <nick> incluye al final el estado de SEENGUARD, evitando ejecutar /barna.seenguardstatus aparte.
  97. 97; - Build 62: IPASNRESCUE_VOICEQUERY: si hay IP sin cache ASN, JOINGUARD/SEENGUARD/TRACE lanzan consulta ASN directa. VOICE no bloquea consulta, solo sancion.
  98. 98; - Build 63: STATS: anade /barna.stats para ver metricas rapidas sin tocar el flujo USERIP/ASN.
  99. 99; - Build 74: USERIPRESCUE_NOWHO: mantiene USERIP, no usa WHO, y rescata lookup/qry atascados sin IP reencolando USERIP de forma acotada.
  100. 100; - Build 75: WHOIP354_STABLE: cambia la obtencion de IP de USERIP/RAW340 a WHO <nick> n%ni/RAW354 con FIFO y capado selectivo 354/315 del addon.
  101. 101; - Build 76: WHOIP_LABELS: cambia solo textos visibles de USERIP a WHOIP/WHO; no renombra variables internas.
  102. 102; - Build 77: WHOIP_STRICTMAP: evita cruces nick/IP usando nick del RAW354 si viene, FIFO solo si hay una consulta pendiente, e inflight por nick.
  103. 103; - Build 78: WHOIP_SINGLEFIFO: mantiene 1 WHOIP inflight y limpia FIFO antes de cada WHO para evitar cruces sin descartar RAW354 validos.
  104. 104; - Build 79: WHOIP_CHAINED: mantiene 1 inflight anti-cruce, pero encadena el siguiente WHOIP al recibir RAW354/315/401 para que no salga con cuenta gotas.
  105. 105; - Build 80: WHOIP_FASTASN: si ya hay IP fresca sin cache ASN, lanza ASN directa inmediatamente sin esperar SEENGUARD/rescate lento.
  106. 106; - Build 81: POSTUPDATE: anade /barna.postupdate y /barna.reload para agrupar limpieza segura tras cambiar de build.
  107. 107; - Build 82: QUEUE250: sube limite WHOIP por defecto a 250 y shed_to a 180 para evitar drops en picos, manteniendo CHAINED+FASTASN y 1 inflight anti-cruce.
  108. 108; - Build 93: DIRECT_JOINFIFO_NOSCAN: consulta cada JOIN por FIFO directa, sin JOINGUARD/SEENGUARD/JOINFIX ni escaneos periodicos. Evita lag masivo manteniendo consulta por JOIN.
  109. 109; - Build 94: JOINFIFO_LIGHTVARS: reduce drasticamente variables por JOIN. La cola WHOIP solo guarda item+pending+chans; no usa q_slot/q_nick/token/fifo pesado. CoreTick no ejecuta GC con $var().
  110. 110; - Build 95: NOSCAN_NOSEEN: elimina %barna_seen.* por JOIN y usa $comchan solo bajo demanda; LAGFLUSH purga familias temporales antiguas y stats deja de contar configs sock_* como sockets.
  111. 111; - Build 96: QFASTCACHE: si una cola ASN pendiente ya tiene cache ASN/ISP, aplica cache, emite aviso y borra la cola fantasma sin esperar socket.
  112. 112; - Build 97: STATEPURGE: purga inmediata por ID/nick de sock/rx/asn_done/temp/asn_val al cerrar o terminar sockets; baja TTL de estados WHOIP/ASN y limpia q_item/q_chans cuando la cola queda idle para evitar miles de variables sin perder consultas por JOIN.
  113. 113; - Build 98: TTLSTATECAP: reduce TTL de estado sock/ASN, purga familias WHOIP/lookup/qry cuando no hay cola ni sockets, anade /barna.varfamilies para diagnostico evaluado y evita crecimiento a miles de variables.
  114. 114; - Build 99: STATECAP_HARDGC: purga familias postconsulta incoherentes cuando total_vars supera el limite: inflight sin WHO actual, q_pending/q_ip/q_chans/q_try sin q_items, lookup/qry/ip_keep/sock_state/echo_asn acumulados. No toca canales ni ASN configurados.
  115. 115; - Build 100: STATECAP_SAFEWHOIP: corrige regresion del 99; no bloquea WHOIP por current_ln ni purga inflight activos mientras hay cola WHOIP real; usa inflight capado para recuperar debug/ASN tras JOIN sin volver a crecimiento 98.
  116. 116; - Build 101: ECHOFAST: acelera la cola local de avisos ASN en canales; evita que se pierdan avisos por cola lenta tras rafagas de JOIN, manteniendo HARDGC/SAFEWHOIP.
  117. 117; - Build 102: WHOIP_USERIPFALLBACK: si WHO termina sin RAW354/IP, prueba USERIP como fallback; /barna.trace fuerza reencolado WHOIP inmediato cuando ve nick online sin IP/cache/cola.
  118. 118; - Build 103: ORPHANPENDINGFIX: corrige pending WHOIP huerfano (q_pending/sent_recent sin q_item/lookup/inflight) que bloqueaba el rescate de nicks como luuciaa.
  119. 119; - Build 104: ECHODEDUPE: refuerza dedupe del aviso ASN por canal+nick+IP+ASN y anade dedupe exacto en cola de eco para evitar doble aviso cuando WHOIP/cache/fallback resuelven casi a la vez.
  120. 120; - Build 105: ORPHANLOOKUPFIX: corrige lookup/qry vivos sin WHOIP real (sin q_item/inflight/qid/socket/IP) que bloqueaban nicks como agus14chileno; /barna.trace y WHOIPRESCUE limpian el estado huerfano y reencolan WHOIP.
  121. 121; - Build 106: ORPHANSTRICT_ECHODEDUPEFIX: rescate estricto de lookup/pending huerfanos aunque existan marcas fantasma; corrige set dinamico del dedupe ASN/cola para frenar duplicados exactos nick+IP+ASN.
  122. 122; - Build 107: TRACEFORCE_DIRECTWHO: /barna.trace y WHOIPRESCUE ya no reencolan por FIFO cuando detectan lookup/qry/pending fantasma; lanzan WHO directo con inflight/current reales para romper estados como hpdk/agus14chileno.
  123. 123; - Build 108: TRACEFORCE_WATCHDOG: tras un WHO directo de /barna.trace, programa una comprobacion corta; si no hay RAW354/IP ni trabajo real, fuerza USERIP fallback o limpia lookup/qry fantasma para que no quede repitiendo estado viejo.
  124. 124; - Build 109: TRACEFORCE_STALEWHO_GC: el watchdog de /barna.trace ya trata su propio WHO directo como stale si a los 8s no hay IP, aunque sigan current/inflight vivos; fuerza USERIP fallback y reprograma una segunda limpieza para evitar lookup/qry fantasma.
  125. 125; - Build 110: AUTOWHORESCUE: CoreTick vuelve a ejecutar WHOIPRESCUE ultraligero para que los nicks con lookup/qry fantasma se rescaten solos sin tener que lanzar /barna.trace; batch pequeno y ritmo corto para no crear lag.
  126. 126; - Build 111: AUTOSTALE_AUTONICKSCAN: ademas del rescate de lookup/qry fantasma, CoreTick hace un escaneo muy acotado de nicklist por canales activos para capturar nicks online que no dispararon JOIN o quedaron sin consulta; no guarda %barna_seen.* persistente y respeta limite de cola WHOIP.
  127. 127; - Build 112: EXCEPTIONSAFE_AUTONICKSCAN: centraliza las excepciones del ON JOIN; esos nicks no se escanean por AUTONICKSCAN/WHOIPRESCUE/TRACE/LOOKUP y no se sancionan aunque coincida ASN/cache/badnick.
  128. 128; - Build 113: PRIVSAFE_MODESTOP: nicks con @/+v/%/&/~ en canales activos no se escanean ni sancionan; al recibir OP/VOICE se cancelan timers WHOIP/ASN/SAQUIT y estado temporal del nick.
  129. 129; - Build 114: JOINONLY_DELAYSAFE: desactiva AUTONICKSCAN/nicklist rescan. Solo consulta por JOIN, con delay configurable para dar tiempo a +v/@; si lo recibe, se cancela todo para ese nick.
  130. 130; - Build 115: JOINDELAY_LIGHTGC: reduce variables por JOIN delay de 5 a 2, purga delay viejo y mantiene politica JOINONLY sin rescan.
  131. 131; - Build 116: WHOIP_AUTOWATCHDOG: cada WHO lanzado por JOIN programa watchdog automatico; si no llega RAW354/IP en 8s prueba USERIP fallback y, si tampoco hay IP, limpia lookup/qry/sent_recent para no depender de /barna.trace.
  132. 132; - Build 120: CACHECAP_ADAPTIVE: bloquea cache nueva cuando cacheASN supera hard y usa drenaje adaptativo.
  133. 133; - Build 120: CACHECAP_MARKGC: corrige drenaje lento/clavado usando marcado de expiracion por claves distintas.
  134. 134; - Build 121: TOTALPRESSURE_GC: si total_vars sigue alto, drena cache hasta target y limpia auxiliares seguros.
  135. 135; - Build 122: JOINWHOIP_UNBLOCK: corrige cuello de botella cuando entran muchos nicks y no sale debug ASN; JOIN_DELAY drena por presion, WHOIP turbo empieza antes y WHOIPRESCUE corre realmente rapido sin esperar 15s internos.
  136. 136; - Build 134: PREFIX_OWNER_GUARD: cada prefijo malo guarda su ASN propietario; al borrar un ASN se purgan sus patrones y toda sancion revalida que el ASN siga activo en el canal.
  137. 137; - Build 135: PREFIX_OWNER_STOREFIX: corrige almacenamiento dinamico de badpfx2/3, mantiene validacion por ASN propietario y añade /barna.pfxstatus.
  138. 138; - Build 136: IPINFO_HTTPS: cambia todas las consultas api.ipinfo.io de HTTP/80 a SSL/443 para evitar 301 sin JSON ASN.
  139. 139; - Build 83: FASTCACHE: si ya hay IP y cache ASN/ISP, aplica cache y emite aviso inmediato, limpiando lookup/qry sin esperar RAW354/SEENGUARD.
  140. 140; - Build 84: WHOIP_TOKENMAP: usa token WHOX unico en RAW354 para mapear nick/IP; no acepta IP por FIFO para evitar cruces.
  141. 141; - Build 85: WHOIP_NICKMAP: si el servidor no devuelve token WHOX, acepta solo RAW354 con nick+IP esperado y mapea por nick, nunca por FIFO.
  142. 142; - Build 86: WHOIP_RAW354IPNICK: adapta el parser al formato real de esta red: RAW354 = <mi_nick> <ip> <nick_consultado>. Mapea por nick consultado esperado, no por FIFO.
  143. 143; - Build 87: WHOIP_CLEANLABELS_RESCUE: cambia textos visibles heredados USERIP->WHOIP y reencola WHOIP desde /barna.trace solo si el nick sigue realmente online y el lookup quedo sin IP/inflight.
  144. 144; - Build 88: WHOIP_VARFIX: corrige extraccion literal de nombres %barna_lookup.* y %barna_seen.* en rescates; evita tratar "%barna_lookup.nick" como nick real y desbloquea limpiezas/consultas.
  145. 145; - Build 89: WHOIP_STRICTDEDUPE_CASEFIX: RAW354 solo se acepta si el nick esta realmente inflight/manual, no solo lookup/qry; el aviso ASN usa el case real del nick en canal y dedupe canonico por canal+nick.
  146. 146; - Build 90: WHOIP_DEDUPE180_CASEFIX: dedupe de avisos ASN por canal+nick durante minimo 180s para evitar duplicados por case/cache/rescate.
  147. 147; - Build 91: WHOIP_DEDUPE180_LIGHT: mantiene dedupe 180s, pero elimina el recorrido completo de nicklist por aviso que podia causar lag en canales grandes; usa cache ligera de case real.
  148. 148; - Build 92: WHOIP_ANTILAGCAP: limpieza anti-lag fuerte de temporales, SEENGUARD desactivado por defecto, dedupe 90s capado y limites bajos de variables para evitar retrasos extremos.
  149. 149; - Build 27: ASNECHO_DEDUPE_UTF8. El aviso concreto:
  150. 150; El usuario <nick> (IP:<ip>) pertenece al ISP: <isp> Con ASN: <asn>
  151. 151; se emite en todos los canales actuales donde este el nick y el addon
  152. 152; este activo. La sancion sigue dependiendo de la coincidencia ASN/canal.
  153. 153; - El mismo aviso no se repite dos veces en el mismo canal/nick durante la ventana de dedupe.
  154. 154; =========================
  155. 155
  156. 156; ------------------------------------------------------------
  157. 157; BLOQUE 1
  158. 158; ESTADO GENERAL POR DEFECTO
  159. 159; ------------------------------------------------------------
  160. 160
  161. 161set %barna_build ASN_ULTRASAFE_BALANCEDSHED_ASNFAST_TRACE_DIRECT136_IPINFO_HTTPS_UTF8_2026_06_24
  162. 162if (%barna_addon == $null) set %barna_addon 1
  163. 163if (%barna_debug == $null) set %barna_debug 0
  164. 164if (%barna_debug_verbose == $null) set %barna_debug_verbose 0
  165. 165if (%barna_debug_rx == $null) set %barna_debug_rx 0
  166. 166
  167. 167if (%barna_q_max_retries == $null) set %barna_q_max_retries 0
  168. 168if (%barna_q_delay == $null) set %barna_q_delay 2
  169. 169if (%barna_q_max_workers == $null) set %barna_q_max_workers 1
  170. 170if (%barna_q_stale_secs == $null) set %barna_q_stale_secs 180
  171. 171if (%barna_q_stale_secs > 180) set %barna_q_stale_secs 180
  172. 172if (%barna_q_low_delay == $null) set %barna_q_low_delay 20
  173. 173if (%barna_asn_pump_delay == $null) set %barna_asn_pump_delay 3
  174. 174if (%barna_asn_turbo_threshold == $null) set %barna_asn_turbo_threshold 30
  175. 175if (%barna_asn_turbo_workers == $null) set %barna_asn_turbo_workers 1
  176. 176
  177. 177if (%barna_userip_retry_max == $null) set %barna_userip_retry_max 0
  178. 178if (%barna_userip_retry_delay == $null) set %barna_userip_retry_delay 15
  179. 179if (%barna_userip_q_delay == $null) set %barna_userip_q_delay 1
  180. 180set %barna_userip_q_batch_max 2
  181. 181set %barna_userip_q_batch_delay 1
  182. 182set %barna_userip_turbo_threshold 10
  183. 183set %barna_userip_turbo_batch_max 3
  184. 184if (%barna_userip_turbo_delay == $null) set %barna_userip_turbo_delay 1
  185. 185set %barna_userip_emergency_threshold 30
  186. 186set %barna_userip_emergency_batch_max 3
  187. 187if (%barna_userip_emergency_delay == $null) set %barna_userip_emergency_delay 1
  188. 188set %barna_userip_q_max_pending 400
  189. 189set %barna_userip_q_shed_to 0
  190. 190set %barna_userip_no_shed 1
  191. 191set %barna_whoip_lightvars 1
  192. 192if (%barna_userip_drop_count == $null) set %barna_userip_drop_count 0
  193. 193if (%barna_userip_retry_backlog_limit == $null) set %barna_userip_retry_backlog_limit 8
  194. 194if (%barna_userip_state_ttl == $null) set %barna_userip_state_ttl 60
  195. 195if (%barna_userip_state_ttl > 60) set %barna_userip_state_ttl 60
  196. 196if (%barna_userip_state_ttl < 30) set %barna_userip_state_ttl 30
  197. 197if (%barna_userip_max_inflight == $null) set %barna_userip_max_inflight 0
  198. 198if (%barna_userip_slow_retry_max == $null) set %barna_userip_slow_retry_max 0
  199. 199if (%barna_userip_slow_retry_delay == $null) set %barna_userip_slow_retry_delay 60
  200. 200if (%barna_userip_retry_timer_mode == $null) set %barna_userip_retry_timer_mode 0
  201. 201if (%barna_userip_watchdog == $null) set %barna_userip_watchdog 0
  202. 202if (%barna_userip_watchdog_delay == $null) set %barna_userip_watchdog_delay 20
  203. 203if (%barna_userip_watchdog_batch == $null) set %barna_userip_watchdog_batch 20
  204. 204if (%barna_userip_watchdog_retry_max == $null) set %barna_userip_watchdog_retry_max 0
  205. 205set %barna_userip_stuck_rescue 1
  206. 206if (%barna_userip_stuck_rescue_secs == $null) set %barna_userip_stuck_rescue_secs 1
  207. 207if (%barna_userip_stuck_rescue_secs > 1) set %barna_userip_stuck_rescue_secs 1
  208. 208if (%barna_userip_stuck_rescue_batch == $null) set %barna_userip_stuck_rescue_batch 10
  209. 209if (%barna_userip_stuck_rescue_batch > 10) set %barna_userip_stuck_rescue_batch 10
  210. 210if (%barna_userip_stuck_rescue_recent_ttl == $null) set %barna_userip_stuck_rescue_recent_ttl 25
  211. 211if (%barna_userip_stuck_rescue_recent_ttl > 25) set %barna_userip_stuck_rescue_recent_ttl 25
  212. 212
  213. 213; Build 115: JOINDELAY_LIGHTGC. AUTONICKSCAN queda desactivado: no se recorre nicklist.
  214. 214; Solo se consultan nicks que disparan JOIN, despues de un delay para respetar +v/@.
  215. 215; El delay usa variables ligeras: chan+ts. No guarda nick/timer/chans por cada JOIN.
  216. 216set %barna_autonickscan 0
  217. 217if (%barna_join_delay_secs == $null) set %barna_join_delay_secs 2
  218. 218if (%barna_join_delay_secs < 1) set %barna_join_delay_secs 1
  219. 219if (%barna_join_delay_secs > 2) set %barna_join_delay_secs 2
  220. 220set %barna_join_delay_lightvars 1
  221. 221if (%barna_join_delay_gc_age == $null) set %barna_join_delay_gc_age 12
  222. 222if (%barna_join_delay_gc_age < 6) set %barna_join_delay_gc_age 6
  223. 223if (%barna_join_delay_gc_age > 30) set %barna_join_delay_gc_age 30
  224. 224if (%barna_join_delay_max_pending == $null) set %barna_join_delay_max_pending 70
  225. 225if (%barna_join_delay_max_pending < 40) set %barna_join_delay_max_pending 40
  226. 226if (%barna_join_delay_max_pending > 200) set %barna_join_delay_max_pending 200
  227. 227if (%barna_join_delay_fast_threshold == $null) set %barna_join_delay_fast_threshold 24
  228. 228if (%barna_join_delay_fast_threshold < 15) set %barna_join_delay_fast_threshold 15
  229. 229if (%barna_join_delay_fast_threshold > 80) set %barna_join_delay_fast_threshold 80
  230. 230if (%barna_join_delay_fast_batch == $null) set %barna_join_delay_fast_batch 10
  231. 231if (%barna_join_delay_fast_batch < 2) set %barna_join_delay_fast_batch 2
  232. 232if (%barna_join_delay_fast_batch > 18) set %barna_join_delay_fast_batch 18
  233. 233if (%barna_join_delay_fast_age == $null) set %barna_join_delay_fast_age 2
  234. 234if (%barna_join_delay_fast_age < 1) set %barna_join_delay_fast_age 1
  235. 235if (%barna_join_delay_fast_age > 4) set %barna_join_delay_fast_age 4
  236. 236if (%barna_whoip_watchdog_secs == $null) set %barna_whoip_watchdog_secs 8
  237. 237if (%barna_whoip_watchdog_secs < 5) set %barna_whoip_watchdog_secs 5
  238. 238if (%barna_whoip_watchdog_secs > 15) set %barna_whoip_watchdog_secs 15
  239. 239if (%barna_whoip_watchdog_fallback_secs == $null) set %barna_whoip_watchdog_fallback_secs 10
  240. 240if (%barna_whoip_watchdog_fallback_secs < 6) set %barna_whoip_watchdog_fallback_secs 6
  241. 241if (%barna_whoip_watchdog_fallback_secs > 20) set %barna_whoip_watchdog_fallback_secs 20
  242. 242if (%barna_autonickscan_secs == $null) set %barna_autonickscan_secs 6
  243. 243if (%barna_autonickscan_secs > 6) set %barna_autonickscan_secs 6
  244. 244if (%barna_autonickscan_batch == $null) set %barna_autonickscan_batch 12
  245. 245if (%barna_autonickscan_batch > 12) set %barna_autonickscan_batch 12
  246. 246if (%barna_autonickscan_recent_ttl == $null) set %barna_autonickscan_recent_ttl 90
  247. 247if (%barna_autonickscan_recent_ttl > 90) set %barna_autonickscan_recent_ttl 90
  248. 248if (%barna_autonickscan_q_limit == $null) set %barna_autonickscan_q_limit 60
  249. 249if (%barna_autonickscan_q_limit > 80) set %barna_autonickscan_q_limit 80
  250. 250
  251. 251; VARHYGIENE54: watchdog ultraligero de JOIN.
  252. 252; No es el watchdog antiguo pesado: usa una cola pequena con TTL corto.
  253. 253set %barna_join_guard 0
  254. 254if (%barna_join_guard_delay == $null) set %barna_join_guard_delay 7
  255. 255if (%barna_join_guard_ttl == $null) set %barna_join_guard_ttl 25
  256. 256if (%barna_join_guard_max == $null) set %barna_join_guard_max 60
  257. 257if (%barna_join_guard_batch == $null) set %barna_join_guard_batch 8
  258. 258if (%barna_asn_cache_ttl == $null) set %barna_asn_cache_ttl 1800
  259. 259; Build 118: cachecap ligero corregido. IMPORTANTE: no purga de golpe; recorta en lotes pequeños con unset dinamico real.
  260. 260if (%barna_cachecap117_enabled == $null) set %barna_cachecap117_enabled 1
  261. 261if (%barna_asn_cache_max_exact == $null) set %barna_asn_cache_max_exact 120
  262. 262if (%barna_asn_cache_max_exact < 80) set %barna_asn_cache_max_exact 80
  263. 263if (%barna_asn_cache_max_exact > 180) set %barna_asn_cache_max_exact 120
  264. 264if (%barna_asn_cache_hard_limit == $null) set %barna_asn_cache_hard_limit 180
  265. 265if (%barna_asn_cache_hard_limit < %barna_asn_cache_max_exact) set %barna_asn_cache_hard_limit $calc(%barna_asn_cache_max_exact + 40)
  266. 266if (%barna_asn_cache_hard_limit > 260) set %barna_asn_cache_hard_limit 180
  267. 267if (%barna_cachecap117_batch == $null) set %barna_cachecap117_batch 12
  268. 268if (%barna_cachecap117_batch < 3) set %barna_cachecap117_batch 3
  269. 269if (%barna_cachecap117_batch > 20) set %barna_cachecap117_batch 12
  270. 270if (%barna_cachecap117_interval == $null) set %barna_cachecap117_interval 3
  271. 271if (%barna_cachecap117_interval < 2) set %barna_cachecap117_interval 2
  272. 272if (%barna_cachecap117_interval > 30) set %barna_cachecap117_interval 3
  273. 273if (%barna_asn_echo_nonmatch == $null) set %barna_asn_echo_nonmatch 1
  274. 274if (%barna_echo_all_common_chans == $null) set %barna_echo_all_common_chans 1
  275. 275if (%barna_echo_queue == $null) set %barna_echo_queue 1
  276. 276if (%barna_echo_q_batch_max == $null) set %barna_echo_q_batch_max 6
  277. 277if (%barna_echo_q_batch_max < 6) set %barna_echo_q_batch_max 6
  278. 278if (%barna_echo_q_batch_max > 8) set %barna_echo_q_batch_max 8
  279. 279if (%barna_echo_q_delay == $null) set %barna_echo_q_delay 1
  280. 280if (%barna_echo_q_delay > 1) set %barna_echo_q_delay 1
  281. 281if (%barna_echo_q_max == $null) set %barna_echo_q_max 160
  282. 282if (%barna_echo_q_max < 160) set %barna_echo_q_max 160
  283. 283if (%barna_echo_q_max > 200) set %barna_echo_q_max 200
  284. 284if (%barna_echo_dedupe_secs == $null) set %barna_echo_dedupe_secs 90
  285. 285if (%barna_echo_dedupe_secs > 90) set %barna_echo_dedupe_secs 90
  286. 286if (%barna_echo_dedupe_secs < 45) set %barna_echo_dedupe_secs 45
  287. 287
  288. 288if (%barna_badpfx_ttl == $null) set %barna_badpfx_ttl 7200
  289. 289if (%barna_badnick_ttl == $null) set %barna_badnick_ttl 1800
  290. 290if (%barna_shun_time == $null) set %barna_shun_time 2h
  291. 291if (%barna_saquit_delay == $null) set %barna_saquit_delay 120
  292. 292if (%barna_saquit_check_delay == $null) set %barna_saquit_check_delay 20
  293. 293if (%barna_saquit_final_delay == $null) set %barna_saquit_final_delay 20
  294. 294if (%barna_sock_timeout_secs == $null) set %barna_sock_timeout_secs 20
  295. 295if (%barna_q_retry_base_secs == $null) set %barna_q_retry_base_secs 90
  296. 296if (%barna_q_retry_max_backoff == $null) set %barna_q_retry_max_backoff 300
  297. 297
  298. 298; VARHYGIENE36: limites anti-lag para variables pesadas.
  299. 299if (%barna_heavy_gc_secs == $null) set %barna_heavy_gc_secs 20
  300. 300if (%barna_sockvar_gc_secs == $null) set %barna_sockvar_gc_secs 10
  301. 301if (%barna_sockvar_max_vars == $null) set %barna_sockvar_max_vars 25
  302. 302if (%barna_sockvar_max_vars > 25) set %barna_sockvar_max_vars 25
  303. 303if (%barna_highflow_gc == $null) set %barna_highflow_gc 1
  304. 304if (%barna_total_max_vars == $null) set %barna_total_max_vars 900
  305. 305if (%barna_total_max_vars > 700) set %barna_total_max_vars 900
  306. 306if (%barna_badpfx_ttl == $null) set %barna_badpfx_ttl 900
  307. 307if (%barna_badpfx_ttl > 900) set %barna_badpfx_ttl 900
  308. 308if (%barna_badpfx2_max_vars == $null) set %barna_badpfx2_max_vars 40
  309. 309if (%barna_badpfx3_max_vars == $null) set %barna_badpfx3_max_vars 80
  310. 310if (%barna_seen_max_vars == $null) set %barna_seen_max_vars 220
  311. 311if (%barna_seen_max_vars > 220) set %barna_seen_max_vars 220
  312. 312if (%barna_echo_seen_max_vars == $null) set %barna_echo_seen_max_vars 60
  313. 313if (%barna_echo_seen_max_vars > 60) set %barna_echo_seen_max_vars 60
  314. 314if (%barna_echo_asn_seen_max_vars == $null) set %barna_echo_asn_seen_max_vars 120
  315. 315if (%barna_echo_asn_seen_max_vars < 120) set %barna_echo_asn_seen_max_vars 120
  316. 316if (%barna_echo_asn_seen_max_vars > 160) set %barna_echo_asn_seen_max_vars 160
  317. 317if (%barna_saquit_emergency_max_vars == $null) set %barna_saquit_emergency_max_vars 300
  318. 318if (%barna_saquit_emergency_max_queue == $null) set %barna_saquit_emergency_max_queue 50
  319. 319if (%barna_lookup_max_vars == $null) set %barna_lookup_max_vars 400
  320. 320if (%barna_lastip_max_vars == $null) set %barna_lastip_max_vars 400
  321. 321if (%barna_ip_keep_ttl == $null) set %barna_ip_keep_ttl 600
  322. 322if (%barna_ip_keep_ttl > 600) set %barna_ip_keep_ttl 600
  323. 323if (%barna_ip_keep_max_vars == $null) set %barna_ip_keep_max_vars 80
  324. 324if (%barna_ip_keep_max_vars > 80) set %barna_ip_keep_max_vars 80
  325. 325if (%barna_lookup_idle_total_max == $null) set %barna_lookup_idle_total_max 200
  326. 326if (%barna_lookup_total_max_vars == $null) set %barna_lookup_total_max_vars 160
  327. 327if (%barna_lookup_total_max_vars > 160) set %barna_lookup_total_max_vars 160
  328. 328if (%barna_badnick_ttl == $null) set %barna_badnick_ttl 900
  329. 329if (%barna_badnick_ttl > 900) set %barna_badnick_ttl 900
  330. 330if (%barna_badnick_max_vars == $null) set %barna_badnick_max_vars 300
  331. 331
  332. 332; ------------------------------------------------------------
  333. 333; BLOQUE 1.1
  334. 334; CONFIGURACION POR CANAL
  335. 335; ------------------------------------------------------------
  336. 336
  337. 337if (%barna_chan.barcelona == $null) set %barna_chan.barcelona 1
  338. 338if (%barna_chan.cataluna == $null) set %barna_chan.cataluna 1
  339. 339if (%barna_chan.espana == $null) set %barna_chan.espana 1
  340. 340if (%barna_chan.amistad == $null) set %barna_chan.amistad 1
  341. 341
  342. 342if (%barna_asn.barcelona == $null) set %barna_asn.barcelona AS12430,AS6739,AS35699
  343. 343if (%barna_asn.cataluna == $null) set %barna_asn.cataluna AS12430,AS6739,AS35699
  344. 344if (%barna_asn.espana == $null) set %barna_asn.espana AS12430,AS6739,AS35699
  345. 345if (%barna_asn.amistad == $null) set %barna_asn.amistad AS12430,AS6739,AS35699
  346. 346
  347. 347; ------------------------------------------------------------
  348. 348; BLOQUE 2
  349. 349; DEBUG
  350. 350; ------------------------------------------------------------
  351. 351
  352. 352alias _barna_debug_window {
  353. 353 if (!$window(@BarnaASNDebug)) window -a @BarnaASNDebug
  354. 354}
  355. 355
  356. 356alias _barna_debug_on {
  357. 357 set %barna_debug 1
  358. 358
  359. 359 if (%barna_debug_verbose == $null) set %barna_debug_verbose 0
  360. 360 if (%barna_debug_rx == $null) set %barna_debug_rx 0
  361. 361
  362. 362 _barna_debug_window
  363. 363 echo @BarnaASNDebug $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Debug ACTIVADO
  364. 364}
  365. 365
  366. 366alias _barna_debug_off {
  367. 367 set %barna_debug 0
  368. 368
  369. 369 if ($window(@BarnaASNDebug)) window -c @BarnaASNDebug
  370. 370
  371. 371 echo -s [ASN] Debug DESACTIVADO
  372. 372}
  373. 373
  374. 374alias _barna_debug_verbose_on {
  375. 375 set %barna_debug_verbose 1
  376. 376 _barna_debug_on
  377. 377 echo @BarnaASNDebug $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Debug detallado ACTIVADO
  378. 378}
  379. 379
  380. 380alias _barna_debug_verbose_off {
  381. 381 set %barna_debug_verbose 0
  382. 382 if (%barna_debug == 1) {
  383. 383 _barna_debug_window
  384. 384 echo @BarnaASNDebug $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Debug detallado DESACTIVADO
  385. 385 }
  386. 386}
  387. 387
  388. 388alias _barna_debug_rx_on {
  389. 389 set %barna_debug_rx 1
  390. 390 _barna_debug_on
  391. 391 echo @BarnaASNDebug $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Debug RX ACTIVADO
  392. 392}
  393. 393
  394. 394alias _barna_debug_rx_off {
  395. 395 set %barna_debug_rx 0
  396. 396 if (%barna_debug == 1) {
  397. 397 _barna_debug_window
  398. 398 echo @BarnaASNDebug $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Debug RX DESACTIVADO
  399. 399 }
  400. 400}
  401. 401
  402. 402alias _barna_dbg_show {
  403. 403 if ($1- == $null) return 0
  404. 404
  405. 405 var %m = $lower($1-)
  406. 406
  407. 407 if ($regex(%m,/(join ok|raw340 recibido|raw354 recibido|ip encontrada|userip cola|whoip|userip queue|lookup start|lookup retry)/i)) return 1
  408. 408 if ($regex(%m,/(queue add|queue baja|queue consulta|queue retry diferido|queue reencolado diferido|queue fallo)/i)) return 1
  409. 409 if ($regex(%m,/(asn resuelto|asn match|badpfx|prefijo asn malo|rx limite)/i)) return 1
  410. 410 if ($regex(%m,/(saquit diferido programado|saquit diferido enviado|saquit diferido cancelado|saquit confirmado|saquit fallido)/i)) return 1
  411. 411 if ($regex(%m,/(saquit\/sapart|segundo saquit|sockopen error|timeout socket|sockclose prematuro|lookup sin ip agotado)/i)) return 1
  412. 412
  413. 413 return 0
  414. 414}
  415. 415
  416. 416alias _barna_dbg {
  417. 417 if (%barna_debug != 1) return
  418. 418
  419. 419 if (%barna_debug_verbose != 1) {
  420. 420 if (!$_barna_dbg_show($1-)) return
  421. 421 }
  422. 422
  423. 423 _barna_debug_window
  424. 424 echo @BarnaASNDebug $timestamp $chr(3) $+ 12 $+ [BARNA-DBG] $chr(15) $+ $chr(32) $+ $1-
  425. 425}
  426. 426
  427. 427; ------------------------------------------------------------
  428. 428; BLOQUE 3
  429. 429; HELPERS GENERALES
  430. 430; ------------------------------------------------------------
  431. 431
  432. 432alias _barna_chan_key {
  433. 433 if ($1 == $null) return
  434. 434
  435. 435 var %k = $lower($1)
  436. 436
  437. 437 if ($left(%k,1) == $chr(35)) var %k = $right(%k,-1)
  438. 438 if ($left(%k,1) == $chr(33)) var %k = $right(%k,-1)
  439. 439 if ($left(%k,1) == $chr(64)) var %k = $right(%k,-1)
  440. 440 if ($left(%k,1) == $chr(43)) var %k = $right(%k,-1)
  441. 441 if ($left(%k,1) == $chr(38)) var %k = $right(%k,-1)
  442. 442
  443. 443 var %k = $replace(%k,á,a,à,a,ä,a,â,a,é,e,è,e,ë,e,ê,e,í,i,ì,i,ï,i,î,i,ó,o,ò,o,ö,o,ô,o,ú,u,ù,u,ü,u,û,u,ñ,n,ç,c)
  444. 444 return %k
  445. 445}
  446. 446
  447. 447alias _barna_getvar {
  448. 448 if ($1 == $null) return
  449. 449 return $($1,2)
  450. 450}
  451. 451
  452. 452; Normaliza nombre de canal quitando prefijos de estado (@, +, etc.)
  453. 453alias _barna_chan_name_clean {
  454. 454 if ($1 == $null) return
  455. 455
  456. 456 var %c = $1
  457. 457
  458. 458 while ($left(%c,1) isin !@+%&) {
  459. 459 var %c = $right(%c,-1)
  460. 460 }
  461. 461
  462. 462 return %c
  463. 463}
  464. 464
  465. 465; Normaliza ASN para comparaciones robustas.
  466. 466alias _barna_norm_asn {
  467. 467 if ($1 == $null) return
  468. 468
  469. 469 var %a = $upper($1)
  470. 470 var %a = $remove(%a,$chr(2),$chr(3),$chr(15),$chr(22),$chr(31),$chr(32),$chr(9),$chr(13),$chr(10))
  471. 471
  472. 472 if (%a == $null) return
  473. 473 if ($left(%a,2) != AS) {
  474. 474 if (%a isnum) var %a = $+(AS,%a)
  475. 475 }
  476. 476
  477. 477 return %a
  478. 478}
  479. 479
  480. 480alias _barna_is_ipv4 {
  481. 481 if ($1 == $null) return 0
  482. 482
  483. 483 if ($regex($1,/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$/)) return 1
  484. 484
  485. 485 return 0
  486. 486}
  487. 487
  488. 488alias _barna_ip_pfx2 {
  489. 489 if ($1 == $null) return
  490. 490 return $gettok($1,1-2,46)
  491. 491}
  492. 492
  493. 493alias _barna_ip_pfx3 {
  494. 494 if ($1 == $null) return
  495. 495 return $gettok($1,1-3,46)
  496. 496}
  497. 497
  498. 498alias _barna_namekey {
  499. 499 if ($1 == $null) return
  500. 500 return $len($1) $+ $chr(126) $+ $1
  501. 501}
  502. 502
  503. 503alias _barna_sock_name {
  504. 504 if ($1 == $null) return
  505. 505
  506. 506 ; VARHYGIENE9:
  507. 507 ; Socket por ID con nombre simple alfanumerico: ipinfo<ID>
  508. 508 ; Evita posibles problemas de mIRC con '_' o '~' en nombres de socket.
  509. 509 if ($2 != $null) return ipinfo $+ $2
  510. 510
  511. 511 ; Compatibilidad con sockets antiguos basados en nick.
  512. 512 return ipinfo $+ $chr(126) $+ $_barna_namekey($1)
  513. 513}
  514. 514
  515. 515alias _barna_sock_to_id {
  516. 516 if ($1 == $null) return
  517. 517
  518. 518 ; Socket moderno VARHYGIENE9: ipinfo<ID>
  519. 519 if ($left($1,6) == ipinfo) {
  520. 520 if ($mid($1,7,1) != $chr(126)) {
  521. 521 if ($mid($1,7,1) != _) return $right($1,-6)
  522. 522 }
  523. 523 }
  524. 524
  525. 525 ; Compatibilidad VARHYGIENE7/8: ipinfo_ID
  526. 526 if ($left($1,7) == ipinfo_) return $right($1,-7)
  527. 527
  528. 528 ; Compatibilidad con socket intermedio: ipinfo~q~ID
  529. 529 if ($gettok($1,1,126) != ipinfo) return
  530. 530 if ($gettok($1,2,126) == q) return $gettok($1,3,126)
  531. 531}
  532. 532
  533. 533alias _barna_sock_to_nick {
  534. 534 if ($1 == $null) return
  535. 535
  536. 536 ; Socket moderno VARHYGIENE9: ipinfo<ID> -> nick guardado en mapa por ID.
  537. 537 if ($left($1,6) == ipinfo) {
  538. 538 if ($mid($1,7,1) != $chr(126)) {
  539. 539 if ($mid($1,7,1) != _) {
  540. 540 var %id9 = $right($1,-6)
  541. 541 return [ [ $+(%,barna_sock_nick.,%id9) ] ]
  542. 542 }
  543. 543 }
  544. 544 }
  545. 545
  546. 546 ; Compatibilidad VARHYGIENE7/8: ipinfo_ID -> nick guardado en mapa por ID.
  547. 547 if ($left($1,7) == ipinfo_) {
  548. 548 var %id0 = $right($1,-7)
  549. 549 return [ [ $+(%,barna_sock_nick.,%id0) ] ]
  550. 550 }
  551. 551
  552. 552 if ($gettok($1,1,126) != ipinfo) return
  553. 553
  554. 554 ; Compatibilidad con socket intermedio: ipinfo~q~ID.
  555. 555 if ($gettok($1,2,126) == q) {
  556. 556 var %id = $gettok($1,3,126)
  557. 557 return [ [ $+(%,barna_sock_nick.,%id) ] ]
  558. 558 }
  559. 559
  560. 560 ; Compatibilidad con sockets antiguos basados en nick.
  561. 561 return $gettok($1,3-,126)
  562. 562}
  563. 563
  564. 564alias _barna_lookup_timer_get {
  565. 565 if ($1 == $null) return
  566. 566
  567. 567 var %ln = $lower($1)
  568. 568 var %t = [ [ $+(%,barna_lookup_timer.,%ln) ] ]
  569. 569
  570. 570 if (%t == $null) {
  571. 571 var %t = BarnaLookup_ $+ $ticks $+ $rand(100,999)
  572. 572 set -u300 %barna_lookup_timer. $+ %ln %t
  573. 573 }
  574. 574
  575. 575 return %t
  576. 576}
  577. 577
  578. 578alias _barna_lookup_timer_off {
  579. 579 if ($1 == $null) return
  580. 580
  581. 581 var %ln = $lower($1)
  582. 582 var %t = [ [ $+(%,barna_lookup_timer.,%ln) ] ]
  583. 583
  584. 584 if (%t != $null) .timer $+ %t off
  585. 585
  586. 586 unset %barna_lookup_timer. $+ %ln
  587. 587}
  588. 588
  589. 589alias _barna_is_join_exception {
  590. 590 if ($1 == $null) return 0
  591. 591
  592. 592 ; Build 112:
  593. 593 ; Lista unica de excepciones heredada del ON JOIN. Estos nicks nunca deben
  594. 594 ; pasar por escaneo automatico ni recibir sancion ASN/badnick aunque coincida.
  595. 595 var %n = $lower($1)
  596. 596
  597. 597 if (%n == nazcar) return 1
  598. 598 if (%n == guest1498) return 1
  599. 599 if (%n == guest1499) return 1
  600. 600 if (%n == lunaclara) return 1
  601. 601 if (%n == elektra) return 1
  602. 602 if (%n == ani3) return 1
  603. 603 if (%n == ashia) return 1
  604. 604 if (%n == invitado-1996) return 1
  605. 605 if (one_one isin %n) return 1
  606. 606 if (%n == elsa97) return 1
  607. 607 if (%n == merchhe76) return 1
  608. 608 if (%n == isop) return 1
  609. 609 if (%n == isvoice) return 1
  610. 610 if (%n == estela_) return 1
  611. 611 if (%n == selva) return 1
  612. 612 if (%n == _pandora75) return 1
  613. 613 if (%n == eguard) return 1
  614. 614 if (%n == jacobo) return 1
  615. 615
  616. 616 return 0
  617. 617}
  618. 618
  619. 619alias _barna_exception_cleanup_nick {
  620. 620 if ($1 == $null) return
  621. 621
  622. 622 var %nick = $1
  623. 623 var %ln = $lower(%nick)
  624. 624 _barna_join_delay_cancel %nick EXCEPTION_SAFE
  625. 625 var %timer = [ [ $+(%,barna_saquit_timer.,%ln) ] ]
  626. 626
  627. 627 if (%timer != $null) .timer $+ %timer off
  628. 628
  629. 629 _barna_lookup_timer_off %nick
  630. 630 var %whoip_timer = BarnaWHOIPChk_ $+ $md5(%ln,0)
  631. 631 if ($timer(%whoip_timer) != $null) .timer $+ %whoip_timer off
  632. 632 _barna_userip_q_release %nick EXCEPTION_SAFE
  633. 633
  634. 634 unset %barna_lookup. $+ %ln
  635. 635 unset %barna_lookup_chans. $+ %ln
  636. 636 unset %barna_qry. $+ %ln
  637. 637 unset %barna_ipdone. $+ %ln
  638. 638 unset %barna_userip_retry. $+ %ln
  639. 639 unset %barna_userip_sent_recent. $+ %ln
  640. 640 unset %barna_userip_sent_ts. $+ %ln
  641. 641 unset %barna_userip_q_pending. $+ %ln
  642. 642 unset %barna_userip_q_chans. $+ %ln
  643. 643 unset %barna_userip_q_slot. $+ %ln
  644. 644 unset %barna_userip_inflight. $+ %ln
  645. 645 unset %barna_userip_stuck_rescue_recent. $+ %ln
  646. 646 unset %barna_autonickscan_recent. $+ %ln
  647. 647 unset %barna_seen_rescue_recent. $+ %ln
  648. 648 unset %barna_badnick. $+ %ln
  649. 649 unset %barna_badnick_ip. $+ %ln
  650. 650 unset %barna_badnick_chans. $+ %ln
  651. 651 unset %barna_hunted. $+ %ln
  652. 652 set -u2 $+(%,barna_saquit_pending.,%ln) 0
  653. 653 set -u2 $+(%,barna_saquit_ip.,%ln) 0
  654. 654 set -u2 $+(%,barna_saquit_chans.,%ln) 0
  655. 655 set -u2 $+(%,barna_saquit_msg.,%ln) 0
  656. 656 set -u2 $+(%,barna_saquit_showchans.,%ln) 0
  657. 657 set -u2 $+(%,barna_saquit_timer.,%ln) 0
  658. 658
  659. 659 _barna_dbg EXCEPTIONSAFE limpia estado temporal: nick= %nick
  660. 660}
  661. 661
  662. 662
  663. 663; ------------------------------------------------------------
  664. 664; BLOQUE 3.0B
  665. 665; PRIVSAFE: nicks con modo de confianza no se escanean ni se sancionan
  666. 666; ------------------------------------------------------------
  667. 667
  668. 668alias _barna_nick_has_safe_prefix {
  669. 669 if ($1 == $null) return 0
  670. 670
  671. 671 var %nick = $1
  672. 672 var %i = 1
  673. 673 var %total = $comchan(%nick,0)
  674. 674
  675. 675 while (%i <= %total) {
  676. 676 var %chan = $comchan(%nick,%i)
  677. 677 var %chan = $_barna_chan_name_clean(%chan)
  678. 678
  679. 679 if ((%chan != $null) && ($_barna_is_chan_enabled(%chan))) {
  680. 680 var %pnick = $nick(%chan,%nick).pnick
  681. 681 var %prefix = $left(%pnick,1)
  682. 682
  683. 683 ; @/+v y modos superiores/medios habituales: ~ & @ % +
  684. 684 if (%prefix == $chr(126)) return 1
  685. 685 if (%prefix == $chr(38)) return 1
  686. 686 if (%prefix == $chr(64)) return 1
  687. 687 if (%prefix == $chr(37)) return 1
  688. 688 if (%prefix == $chr(43)) return 1
  689. 689
  690. 690 ; Fallback por propiedades de mIRC si la red/tema no muestra prefijo normal.
  691. 691 if ($nick(%chan,%nick).owner == $true) return 1
  692. 692 if ($nick(%chan,%nick).protect == $true) return 1
  693. 693 if ($nick(%chan,%nick).op == $true) return 1
  694. 694 if ($nick(%chan,%nick).hop == $true) return 1
  695. 695 if ($nick(%chan,%nick).voice == $true) return 1
  696. 696 }
  697. 697
  698. 698 inc %i
  699. 699 }
  700. 700
  701. 701 return 0
  702. 702}
  703. 703
  704. 704alias _barna_is_privileged_nick {
  705. 705 if ($1 == $null) return 0
  706. 706
  707. 707 var %nick = $1
  708. 708 var %ln = $lower(%nick)
  709. 709
  710. 710 if ($_barna_is_join_exception(%nick)) return 1
  711. 711 if ([ [ $+(%,barna_privileged.,%ln) ] ] == 1) return 1
  712. 712 if ($_barna_nick_has_safe_prefix(%nick)) return 1
  713. 713
  714. 714 return 0
  715. 715}
  716. 716
  717. 717alias _barna_privileged_cleanup_nick {
  718. 718 if ($1 == $null) return
  719. 719
  720. 720 var %nick = $1
  721. 721 var %reason = $2-
  722. 722 var %ln = $lower(%nick)
  723. 723 _barna_join_delay_cancel %nick PRIVSAFE_MODE
  724. 724 var %actions = 0
  725. 725 var %haswho = 0
  726. 726 var %qid = $_barna_trace_queue_find(%nick)
  727. 727
  728. 728 set -u900 %barna_privileged. $+ %ln 1
  729. 729
  730. 730 var %timer = [ [ $+(%,barna_saquit_timer.,%ln) ] ]
  731. 731 if (%timer != $null) {
  732. 732 .timer $+ %timer off
  733. 733 inc %actions
  734. 734 }
  735. 735
  736. 736 var %trace_timer = BarnaTraceWHOChk_ $+ $md5(%ln,0)
  737. 737 if ($timer(%trace_timer) != $null) {
  738. 738 .timer $+ %trace_timer off
  739. 739 inc %actions
  740. 740 }
  741. 741
  742. 742 var %whoip_timer = BarnaWHOIPChk_ $+ $md5(%ln,0)
  743. 743 if ($timer(%whoip_timer) != $null) {
  744. 744 .timer $+ %whoip_timer off
  745. 745 inc %actions
  746. 746 }
  747. 747
  748. 748 var %slowt = [ [ $+(%,barna_userip_slow_timer.,%ln) ] ]
  749. 749 if (%slowt != $null) {
  750. 750 .timer $+ %slowt off
  751. 751 inc %actions
  752. 752 }
  753. 753
  754. 754 if ([ [ $+(%,barna_lookup.,%ln) ] ] == 1) var %haswho = 1
  755. 755 if ([ [ $+(%,barna_qry.,%ln) ] ] != $null) var %haswho = 1
  756. 756 if ([ [ $+(%,barna_userip_q_pending.,%ln) ] ] == 1) var %haswho = 1
  757. 757 if ([ [ $+(%,barna_userip_q_chans.,%ln) ] ] != $null) var %haswho = 1
  758. 758 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) var %haswho = 1
  759. 759 if ([ [ $+(%,barna_userip_sent_recent.,%ln) ] ] == 1) var %haswho = 1
  760. 760 if (%barna_whoip_current_ln == %ln) var %haswho = 1
  761. 761
  762. 762 if (%haswho == 1) {
  763. 763 _barna_lookup_timer_off %nick
  764. 764 _barna_userip_q_release %nick PRIVSAFE_MODE
  765. 765 inc %actions
  766. 766 }
  767. 767
  768. 768 if (%qid != $null) {
  769. 769 noop $_barna_q_remove_for_nick(%nick,PRIVSAFE_MODE)
  770. 770 inc %actions
  771. 771 }
  772. 772
  773. 773 var %pending = [ [ $+(%,barna_saquit_pending.,%ln) ] ]
  774. 774 var %hunted = [ [ $+(%,barna_hunted.,%ln) ] ]
  775. 775 var %bad = [ [ $+(%,barna_badnick.,%ln) ] ]
  776. 776 var %ip = [ [ $+(%,barna_saquit_ip.,%ln) ] ]
  777. 777 if (%ip == $null) var %ip = $_barna_ip_get(%nick)
  778. 778
  779. 779 if ([ [ $+(%,barna_saquit_ip.,%ln) ] ] != $null) inc %actions
  780. 780 if (%pending == 1) inc %actions
  781. 781 if (%hunted == 1) inc %actions
  782. 782 if (%bad == 1) inc %actions
  783. 783
  784. 784 ; Solo retirar SHUN si habia estado de sancion/cola/timer. Evita spam por autoscan.
  785. 785 if ((%ip != $null) && ((%pending == 1) || (%hunted == 1) || (%timer != $null) || (%qid != $null))) .quote SHUN $+(*!*@,%ip)
  786. 786 if ((%pending == 1) || (%hunted == 1) || (%timer != $null) || (%qid != $null)) .shun %nick
  787. 787
  788. 788 unset %barna_lookup. $+ %ln
  789. 789 unset %barna_lookup_chans. $+ %ln
  790. 790 unset %barna_qry. $+ %ln
  791. 791 unset %barna_ipdone. $+ %ln
  792. 792 unset %barna_userip_retry. $+ %ln
  793. 793 unset %barna_userip_sent_recent. $+ %ln
  794. 794 unset %barna_userip_sent_ts. $+ %ln
  795. 795 unset %barna_userip_watchtry. $+ %ln
  796. 796 unset %barna_userip_slow_retry. $+ %ln
  797. 797 unset %barna_userip_slow_timer. $+ %ln
  798. 798 unset %barna_userip_q_pending. $+ %ln
  799. 799 unset %barna_userip_q_chans. $+ %ln
  800. 800 unset %barna_userip_q_slot. $+ %ln
  801. 801 unset %barna_userip_q_nick. $+ %ln
  802. 802 unset %barna_userip_inflight. $+ %ln
  803. 803 unset %barna_userip_stuck_rescue_recent. $+ %ln
  804. 804 unset %barna_autonickscan_recent. $+ %ln
  805. 805 unset %barna_seen_rescue_recent. $+ %ln
  806. 806 unset %barna_whoip_sent. $+ %ln
  807. 807
  808. 808 if (%barna_whoip_current_ln == %ln) {
  809. 809 unset %barna_whoip_current_nick
  810. 810 unset %barna_whoip_current_ln
  811. 811 unset %barna_whoip_315_done_pending
  812. 812 }
  813. 813
  814. 814 unset %barna_badnick. $+ %ln
  815. 815 unset %barna_badnick_ip. $+ %ln
  816. 816 unset %barna_badnick_chans. $+ %ln
  817. 817 unset %barna_hunted. $+ %ln
  818. 818 set -u2 $+(%,barna_saquit_pending.,%ln) 0
  819. 819 set -u2 $+(%,barna_saquit_ip.,%ln) 0
  820. 820 set -u2 $+(%,barna_saquit_chans.,%ln) 0
  821. 821 set -u2 $+(%,barna_saquit_msg.,%ln) 0
  822. 822 set -u2 $+(%,barna_saquit_showchans.,%ln) 0
  823. 823 set -u2 $+(%,barna_saquit_sent.,%ln) 0
  824. 824 set -u2 $+(%,barna_saquit_timer.,%ln) 0
  825. 825
  826. 826 if (%actions > 0) _barna_dbg PRIVSAFE limpia/para temporales por @/+v: nick= %nick reason= %reason ip= %ip acciones= %actions
  827. 827}
  828. 828
  829. 829alias _barna_shun_nick {
  830. 830 if ($1 == $null) return
  831. 831
  832. 832 var %nick = $1
  833. 833 if ($_barna_is_join_exception(%nick)) {
  834. 834 _barna_dbg EXCEPTIONSAFE evita SHUN por nick: nick= %nick
  835. 835 _barna_exception_cleanup_nick %nick
  836. 836 return
  837. 837 }
  838. 838 if ($_barna_is_privileged_nick(%nick)) {
  839. 839 _barna_dbg PRIVSAFE evita SHUN por nick con @/+v: nick= %nick
  840. 840 _barna_privileged_cleanup_nick %nick SHUN_NICK
  841. 841 return
  842. 842 }
  843. 843 var %reason = $2-
  844. 844 var %dur = %barna_shun_time
  845. 845
  846. 846 if (%dur == $null) var %dur = 2h
  847. 847 if (%reason == $null) var %reason = Molestias en Canales (A)
  848. 848
  849. 849 _barna_dbg SHUN enviado por nick: nick= %nick dur= %dur reason= %reason
  850. 850
  851. 851 .quote SHUN %nick %dur $+(:,%reason)
  852. 852}
  853. 853
  854. 854alias _barna_shun_ip {
  855. 855 if ($1 == $null) return
  856. 856
  857. 857 var %ip = $1
  858. 858 var %reason = $2-
  859. 859 var %dur = %barna_shun_time
  860. 860
  861. 861 if (!$_barna_is_ipv4(%ip)) return
  862. 862 if (%dur == $null) var %dur = 2h
  863. 863 if (%reason == $null) var %reason = Molestias en Canales (A)
  864. 864
  865. 865 _barna_dbg SHUN enviado por IP: ip= %ip dur= %dur reason= %reason
  866. 866
  867. 867 .quote SHUN $+(*!*@,%ip) %dur $+(:,%reason)
  868. 868}
  869. 869
  870. 870alias _barna_mark_badnick {
  871. 871 if ($1 == $null) return
  872. 872
  873. 873 var %nick = $1
  874. 874 var %ip = $2
  875. 875 var %scope_in = $3-
  876. 876 var %ttl = %barna_badnick_ttl
  877. 877 var %ln = $lower(%nick)
  878. 878
  879. 879 if ($_barna_is_join_exception(%nick)) {
  880. 880 _barna_dbg EXCEPTIONSAFE no guarda BADNICK: nick= %nick ip= %ip
  881. 881 _barna_exception_cleanup_nick %nick
  882. 882 return
  883. 883 }
  884. 884
  885. 885 if ($_barna_is_privileged_nick(%nick)) {
  886. 886 _barna_dbg PRIVSAFE no guarda BADNICK por @/+v: nick= %nick ip= %ip
  887. 887 _barna_privileged_cleanup_nick %nick BADNICK
  888. 888 return
  889. 889 }
  890. 890
  891. 891 if (%ttl !isnum 60-) var %ttl = 1800
  892. 892
  893. 893 var %scope = $_barna_chan_list_clean_enabled(%scope_in)
  894. 894 if (%scope == $null) var %scope = $_barna_nick_enabled_chans(%nick)
  895. 895
  896. 896 ; VARHYGIENE49:
  897. 897 ; BADNICK deja de ser global. Solo se guarda si existe canal scope,
  898. 898 ; para evitar sanciones por patron en canales donde ese ASN no fue cazado.
  899. 899 if (%scope == $null) {
  900. 900 _barna_dbg BADNICK no guardado porque no hay canales scope: nick= %nick ip= %ip
  901. 901 return
  902. 902 }
  903. 903
  904. 904 set $+(-u,%ttl) %barna_badnick. $+ %ln 1
  905. 905 set $+(-u,%ttl) %barna_badnick_chans. $+ %ln %scope
  906. 906 if (%ip != $null) set $+(-u,%ttl) %barna_badnick_ip. $+ %ln %ip
  907. 907
  908. 908 _barna_dbg BADNICK guardado temporalmente: nick= %nick ip= %ip chans= %scope ttl= %ttl
  909. 909}
  910. 910
  911. 911; ------------------------------------------------------------
  912. 912; BLOQUE 3.1
  913. 913; HELPERS DE CANAL
  914. 914; ------------------------------------------------------------
  915. 915
  916. 916alias _barna_is_chan_enabled {
  917. 917 if ($1 == $null) return 0
  918. 918
  919. 919 var %key = $_barna_chan_key($1)
  920. 920 var %varname = $+(%,barna_chan.,%key)
  921. 921 var %val = $_barna_getvar(%varname)
  922. 922
  923. 923 if (%val == 1) return 1
  924. 924 return 0
  925. 925}
  926. 926
  927. 927alias _barna_chan_on {
  928. 928 if ($1 == $null) return
  929. 929
  930. 930 var %key = $_barna_chan_key($1)
  931. 931 set %barna_chan. $+ %key 1
  932. 932 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Canal activado: $chr(2) $+ $1 $+ $chr(15)
  933. 933}
  934. 934
  935. 935alias _barna_chan_off {
  936. 936 if ($1 == $null) return
  937. 937
  938. 938 var %key = $_barna_chan_key($1)
  939. 939 set %barna_chan. $+ %key 0
  940. 940 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Canal desactivado: $chr(2) $+ $1 $+ $chr(15)
  941. 941}
  942. 942
  943. 943alias _barna_chan_toggle {
  944. 944 if ($1 == $null) return
  945. 945
  946. 946 if ($_barna_is_chan_enabled($1)) {
  947. 947 _barna_chan_off $1
  948. 948 }
  949. 949 else {
  950. 950 _barna_chan_on $1
  951. 951 }
  952. 952}
  953. 953
  954. 954alias _barna_get_asn_list {
  955. 955 if ($1 == $null) return
  956. 956
  957. 957 var %key = $_barna_chan_key($1)
  958. 958 var %varname = $+(%,barna_asn.,%key)
  959. 959 return $_barna_getvar(%varname)
  960. 960}
  961. 961
  962. 962alias _barna_asn_in_chan {
  963. 963 if ($1 == $null) return 0
  964. 964 if ($2 == $null) return 0
  965. 965
  966. 966 var %list = $_barna_get_asn_list($1)
  967. 967 if (%list == $null) return 0
  968. 968
  969. 969 var %asn = $_barna_norm_asn($2)
  970. 970 if (%asn == $null) return 0
  971. 971
  972. 972 ; VARHYGIENE45:
  973. 973 ; Comparacion robusta token a token para evitar falsos negativos.
  974. 974 ; Acepta listas separadas por coma con espacios o formato accidental.
  975. 975 var %i = 1
  976. 976 while (%i <= $numtok(%list,44)) {
  977. 977 var %tok = $_barna_norm_asn($gettok(%list,%i,44))
  978. 978
  979. 979 if (%tok != $null) {
  980. 980 if (%tok == %asn) return 1
  981. 981 if ($remove(%tok,AS) == $remove(%asn,AS)) return 1
  982. 982 }
  983. 983
  984. 984 inc %i
  985. 985 }
  986. 986
  987. 987 return 0
  988. 988}
  989. 989
  990. 990alias _barna_asn_filter_active_chans {
  991. 991 if ($1 == $null) return
  992. 992 if ($2 == $null) return
  993. 993
  994. 994 var %asn = $_barna_norm_asn($1)
  995. 995 var %chans = $replace($2-,$chr(32),$chr(44))
  996. 996 var %out
  997. 997 var %i = 1
  998. 998
  999. 999 if (%asn == $null) return
  1000. 1000
  1001. 1001 while (%i <= $numtok(%chans,44)) {
  1002. 1002 var %c = $_barna_chan_name_clean($gettok(%chans,%i,44))
  1003. 1003
  1004. 1004 if (%c != $null) {
  1005. 1005 if ($_barna_is_chan_enabled(%c)) {
  1006. 1006 if ($_barna_asn_in_chan(%c,%asn)) {
  1007. 1007 if (%out == $null) var %out = %c
  1008. 1008 else if (!$istok(%out,%c,44)) var %out = $addtok(%out,%c,44)
  1009. 1009 }
  1010. 1010 }
  1011. 1011 }
  1012. 1012
  1013. 1013 inc %i
  1014. 1014 }
  1015. 1015
  1016. 1016 return %out
  1017. 1017}
  1018. 1018
  1019. 1019alias _barna_asn_match_chans_for_nick {
  1020. 1020 if ($1 == $null) return
  1021. 1021 if ($2 == $null) return
  1022. 1022
  1023. 1023 var %nick = $1
  1024. 1024 var %asn = $_barna_norm_asn($2)
  1025. 1025 var %input = $3-
  1026. 1026 var %candidates
  1027. 1027 var %out
  1028. 1028 var %i = 1
  1029. 1029
  1030. 1030 ; VARHYGIENE45:
  1031. 1031 ; Construimos candidatos mezclando canales vivos, input y seen.
  1032. 1032 ; Esto evita que el eco multicanal informe pero la sancion no encuentre
  1033. 1033 ; el canal configurado cuando una rama trae canales incompletos.
  1034. 1034 var %live = $_barna_nick_enabled_chans(%nick)
  1035. 1035 var %seen = $_barna_seen_get(%nick)
  1036. 1036 var %echo = $_barna_echo_chans_for_nick(%nick,%input)
  1037. 1037
  1038. 1038 if (%echo != $null) var %candidates = %echo
  1039. 1039 if (%live != $null) {
  1040. 1040 var %j = 1
  1041. 1041 while (%j <= $numtok(%live,44)) {
  1042. 1042 var %lc = $_barna_chan_name_clean($gettok(%live,%j,44))
  1043. 1043 if (%lc != $null) {
  1044. 1044 if (%candidates == $null) var %candidates = %lc
  1045. 1045 else if (!$istok(%candidates,%lc,44)) var %candidates = $addtok(%candidates,%lc,44)
  1046. 1046 }
  1047. 1047 inc %j
  1048. 1048 }
  1049. 1049 }
  1050. 1050 if (%input != $null) {
  1051. 1051 var %input = $replace(%input,$chr(32),$chr(44))
  1052. 1052 var %j = 1
  1053. 1053 while (%j <= $numtok(%input,44)) {
  1054. 1054 var %ic = $_barna_chan_name_clean($gettok(%input,%j,44))
  1055. 1055 if (%ic != $null) {
  1056. 1056 if ($_barna_is_chan_enabled(%ic)) {
  1057. 1057 if (%candidates == $null) var %candidates = %ic
  1058. 1058 else if (!$istok(%candidates,%ic,44)) var %candidates = $addtok(%candidates,%ic,44)
  1059. 1059 }
  1060. 1060 }
  1061. 1061 inc %j
  1062. 1062 }
  1063. 1063 }
  1064. 1064 if (%seen != $null) {
  1065. 1065 var %seen = $replace(%seen,$chr(32),$chr(44))
  1066. 1066 var %j = 1
  1067. 1067 while (%j <= $numtok(%seen,44)) {
  1068. 1068 var %sc = $_barna_chan_name_clean($gettok(%seen,%j,44))
  1069. 1069 if (%sc != $null) {
  1070. 1070 if ($_barna_is_chan_enabled(%sc)) {
  1071. 1071 if (%candidates == $null) var %candidates = %sc
  1072. 1072 else if (!$istok(%candidates,%sc,44)) var %candidates = $addtok(%candidates,%sc,44)
  1073. 1073 }
  1074. 1074 }
  1075. 1075 inc %j
  1076. 1076 }
  1077. 1077 }
  1078. 1078
  1079. 1079 if (%candidates == $null) return
  1080. 1080
  1081. 1081 while (%i <= $numtok(%candidates,44)) {
  1082. 1082 var %c = $_barna_chan_name_clean($gettok(%candidates,%i,44))
  1083. 1083
  1084. 1084 if (%c != $null) {
  1085. 1085 if ($_barna_asn_in_chan(%c,%asn)) {
  1086. 1086 if (%out == $null) var %out = %c
  1087. 1087 else if (!$istok(%out,%c,44)) var %out = $addtok(%out,%c,44)
  1088. 1088 }
  1089. 1089 }
  1090. 1090
  1091. 1091 inc %i
  1092. 1092 }
  1093. 1093
  1094. 1094 return %out
  1095. 1095}
  1096. 1096
  1097. 1097alias barna.asncheck {
  1098. 1098 if ($1 == $null) || ($2 == $null) {
  1099. 1099 echo -a [ASN] Uso: /barna.asncheck <#canal> <ASN>
  1100. 1100 return
  1101. 1101 }
  1102. 1102
  1103. 1103 echo -a [ASN] ASN check canal= $1 asn= $upper($2) match= $_barna_asn_in_chan($1,$2) lista= $_barna_get_asn_list($1)
  1104. 1104}
  1105. 1105
  1106. 1106alias barna.asnchecknick {
  1107. 1107 if ($1 == $null) || ($2 == $null) {
  1108. 1108 echo -a [ASN] Uso: /barna.asnchecknick <nick> <ASN> [#canal,#canal]
  1109. 1109 return
  1110. 1110 }
  1111. 1111
  1112. 1112 var %nick = $1
  1113. 1113 var %asn = $2
  1114. 1114 var %chans = $3-
  1115. 1115 var %match = $_barna_asn_match_chans_for_nick(%nick,%asn,%chans)
  1116. 1116 echo -a [ASN] ASN check nick= %nick asn= $_barna_norm_asn(%asn) match_chans= %match live= $_barna_nick_enabled_chans(%nick) seen= $_barna_seen_get(%nick) input= %chans
  1117. 1117}
  1118. 1118
  1119. 1119alias _barna_chan_add_asn {
  1120. 1120 if ($1 == $null) return
  1121. 1121 if ($2 == $null) return
  1122. 1122
  1123. 1123 var %chan = $1
  1124. 1124 var %key = $_barna_chan_key(%chan)
  1125. 1125 var %asn = $upper($2)
  1126. 1126
  1127. 1127 if (!$regex(%asn,/^AS\d+$/i)) {
  1128. 1128 echo -a $timestamp $chr(3) $+ 4 $+ [ASN] $chr(15) $+ ASN no válido: $chr(2) $+ %asn $+ $chr(15)
  1129. 1129 return
  1130. 1130 }
  1131. 1131
  1132. 1132 var %varname = $+(%,barna_asn.,%key)
  1133. 1133 var %list = $_barna_getvar(%varname)
  1134. 1134
  1135. 1135 if (%list == $null) {
  1136. 1136 set %barna_asn. $+ %key %asn
  1137. 1137 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Añadido ASN $chr(2) $+ %asn $+ $chr(15) $+ al canal $chr(2) $+ %chan $+ $chr(15)
  1138. 1138 return
  1139. 1139 }
  1140. 1140
  1141. 1141 if ($istok(%list,%asn,44)) {
  1142. 1142 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Ese ASN ya existe en $chr(2) $+ %chan $+ $chr(15)
  1143. 1143 return
  1144. 1144 }
  1145. 1145
  1146. 1146 set %barna_asn. $+ %key $addtok(%list,%asn,44)
  1147. 1147 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Añadido ASN $chr(2) $+ %asn $+ $chr(15) $+ al canal $chr(2) $+ %chan $+ $chr(15)
  1148. 1148}
  1149. 1149
  1150. 1150alias _barna_chan_del_asn {
  1151. 1151 if ($1 == $null) return
  1152. 1152 if ($2 == $null) return
  1153. 1153
  1154. 1154 var %chan = $1
  1155. 1155 var %key = $_barna_chan_key(%chan)
  1156. 1156 var %asn = $_barna_norm_asn($2)
  1157. 1157 var %varname = $+(%,barna_asn.,%key)
  1158. 1158 var %list = $_barna_getvar(%varname)
  1159. 1159
  1160. 1160 if (%asn == $null) return
  1161. 1161
  1162. 1162 if (%list == $null) {
  1163. 1163 var %pfxclean = $_barna_bad_prefix_prune_channel(%chan)
  1164. 1164 echo -a $timestamp $chr(3) $+ 4 $+ [ASN] $chr(15) $+ El canal $chr(2) $+ %chan $+ $chr(15) $+ no tiene ASN configurados. Prefijos obsoletos limpiados: %pfxclean
  1165. 1165 return
  1166. 1166 }
  1167. 1167
  1168. 1168 if (!$istok(%list,%asn,44)) {
  1169. 1169 var %pfxclean = $_barna_bad_prefix_prune_channel(%chan)
  1170. 1170 echo -a $timestamp $chr(3) $+ 4 $+ [ASN] $chr(15) $+ El ASN $chr(2) $+ %asn $+ $chr(15) $+ no existe en $chr(2) $+ %chan $+ $chr(15) $+ . Prefijos obsoletos limpiados: %pfxclean
  1171. 1171 return
  1172. 1172 }
  1173. 1173
  1174. 1174 var %new = $remtok(%list,%asn,1,44)
  1175. 1175
  1176. 1176 if (%new == $null) {
  1177. 1177 unset %barna_asn. $+ %key
  1178. 1178 }
  1179. 1179 else {
  1180. 1180 set %barna_asn. $+ %key %new
  1181. 1181 }
  1182. 1182
  1183. 1183 var %pfxclean = $_barna_bad_prefix_prune_channel(%chan)
  1184. 1184 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ Eliminado ASN $chr(2) $+ %asn $+ $chr(15) del canal $chr(2) $+ %chan $+ $chr(15) $+ . Prefijos actualizados/eliminados: %pfxclean
  1185. 1185}
  1186. 1186
  1187. 1187alias _barna_chan_list_asn {
  1188. 1188 if ($1 == $null) {
  1189. 1189 echo -a $timestamp $chr(3) $+ 4 $+ [ASN] $chr(15) $+ No se recibió canal.
  1190. 1190 return
  1191. 1191 }
  1192. 1192
  1193. 1193 var %chan = $1
  1194. 1194 var %key = $_barna_chan_key(%chan)
  1195. 1195 var %varname = $+(%,barna_asn.,%key)
  1196. 1196 var %list = $_barna_getvar(%varname)
  1197. 1197
  1198. 1198 if (%list == $null) {
  1199. 1199 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ ASN en $chr(2) $+ %chan $+ $chr(15) $+ : ninguno
  1200. 1200 return
  1201. 1201 }
  1202. 1202
  1203. 1203 echo -a $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ ASN en $chr(2) $+ %chan $+ $chr(15) $+ : %list
  1204. 1204}
  1205. 1205
  1206. 1206alias _barna_chan_add_asn_input {
  1207. 1207 if ($1 == $null) return
  1208. 1208
  1209. 1209 var %asn = $input(Escribe el ASN a añadir para $1,e,Barna ASN por canal)
  1210. 1210 if (%asn == $null) return
  1211. 1211
  1212. 1212 _barna_chan_add_asn $1 %asn
  1213. 1213}
  1214. 1214
  1215. 1215alias _barna_chan_del_asn_input {
  1216. 1216 if ($1 == $null) return
  1217. 1217
  1218. 1218 var %asn = $input(Escribe el ASN a borrar de $1,e,Barna ASN por canal)
  1219. 1219 if (%asn == $null) return
  1220. 1220
  1221. 1221 _barna_chan_del_asn $1 %asn
  1222. 1222}
  1223. 1223
  1224. 1224; ------------------------------------------------------------
  1225. 1225; BLOQUE 3.2
  1226. 1226; SEGUIMIENTO DE CANALES POR NICK
  1227. 1227; ------------------------------------------------------------
  1228. 1228
  1229. 1229alias _barna_seen_add {
  1230. 1230 ; Build 95:
  1231. 1231 ; No guardar %barna_seen.* por cada JOIN. Era una de las familias que
  1232. 1232 ; crecia en canales grandes. La consulta por JOIN NO se pierde: el JOIN
  1233. 1233 ; guarda sus canales en %barna_userip_q_chans.<nick> y, cuando hace falta,
  1234. 1234 ; se usa $comchan mediante _barna_nick_enabled_chans.
  1235. 1235 return
  1236. 1236}
  1237. 1237
  1238. 1238alias _barna_seen_del {
  1239. 1239 ; Compatibilidad: limpiar restos antiguos si existen.
  1240. 1240 if ($1 == $null) return
  1241. 1241 var %ln = $lower($1)
  1242. 1242 unset %barna_seen. $+ %ln
  1243. 1243 unset %barna_seen_display. $+ %ln
  1244. 1244}
  1245. 1245
  1246. 1246alias _barna_seen_get {
  1247. 1247 ; Build 95: sin cache seen persistente. Devolver canales activos reales.
  1248. 1248 if ($1 == $null) return
  1249. 1249 return $_barna_nick_enabled_chans($1)
  1250. 1250}
  1251. 1251
  1252. 1252alias _barna_nick_enabled_chans {
  1253. 1253 if ($1 == $null) return
  1254. 1254
  1255. 1255 var %nick = $1
  1256. 1256 var %i = 1
  1257. 1257 var %out
  1258. 1258
  1259. 1259 while (%i <= $comchan(%nick,0)) {
  1260. 1260 var %c = $comchan(%nick,%i)
  1261. 1261 var %c = $_barna_chan_name_clean(%c)
  1262. 1262
  1263. 1263 if (%c != $null) {
  1264. 1264 if ($_barna_is_chan_enabled(%c)) {
  1265. 1265 if (%out == $null) var %out = %c
  1266. 1266 else if (!$istok(%out,%c,44)) var %out = $addtok(%out,%c,44)
  1267. 1267 }
  1268. 1268 }
  1269. 1269
  1270. 1270 inc %i
  1271. 1271 }
  1272. 1272
  1273. 1273 return %out
  1274. 1274}
  1275. 1275
  1276. 1276alias _barna_chan_list_clean_enabled {
  1277. 1277 if ($1- == $null) return
  1278. 1278
  1279. 1279 var %input = $replace($1-,$chr(32),$chr(44))
  1280. 1280 var %i = 1
  1281. 1281 var %out
  1282. 1282
  1283. 1283 while (%i <= $numtok(%input,44)) {
  1284. 1284 var %c = $_barna_chan_name_clean($gettok(%input,%i,44))
  1285. 1285
  1286. 1286 if (%c != $null) {
  1287. 1287 if ($_barna_is_chan_enabled(%c)) {
  1288. 1288 if (%out == $null) var %out = %c
  1289. 1289 else if (!$istok(%out,%c,44)) var %out = $addtok(%out,%c,44)
  1290. 1290 }
  1291. 1291 }
  1292. 1292
  1293. 1293 inc %i
  1294. 1294 }
  1295. 1295
  1296. 1296 return %out
  1297. 1297}
  1298. 1298
  1299. 1299alias _barna_chan_list_intersect_enabled {
  1300. 1300 if ($1 == $null) return
  1301. 1301 if ($2 == $null) return
  1302. 1302
  1303. 1303 var %a = $_barna_chan_list_clean_enabled($1)
  1304. 1304 var %b = $_barna_chan_list_clean_enabled($2)
  1305. 1305 var %i = 1
  1306. 1306 var %out
  1307. 1307
  1308. 1308 if (%a == $null) return
  1309. 1309 if (%b == $null) return
  1310. 1310
  1311. 1311 while (%i <= $numtok(%a,44)) {
  1312. 1312 var %c = $gettok(%a,%i,44)
  1313. 1313
  1314. 1314 if (%c != $null) {
  1315. 1315 if ($istok(%b,%c,44)) {
  1316. 1316 if (%out == $null) var %out = %c
  1317. 1317 else if (!$istok(%out,%c,44)) var %out = $addtok(%out,%c,44)
  1318. 1318 }
  1319. 1319 }
  1320. 1320
  1321. 1321 inc %i
  1322. 1322 }
  1323. 1323
  1324. 1324 return %out
  1325. 1325}
  1326. 1326
  1327. 1327; Devuelve los canales donde el nick esta PRESENTE ahora mismo y el addon
  1328. 1328; esta activo. Si $comchan no devuelve nada, usa los canales guardados
  1329. 1329; como fallback para no perder el aviso si el nick acaba de salir.
  1330. 1330alias _barna_echo_chans_for_nick {
  1331. 1331 if ($1 == $null) return
  1332. 1332
  1333. 1333 var %nick = $1
  1334. 1334 var %input = $2-
  1335. 1335 var %out
  1336. 1336 var %i = 1
  1337. 1337
  1338. 1338 if (%barna_echo_all_common_chans == 1) {
  1339. 1339 var %live = $_barna_nick_enabled_chans(%nick)
  1340. 1340 if (%live != $null) return %live
  1341. 1341 }
  1342. 1342
  1343. 1343 if (%input != $null) var %input = $replace(%input,$chr(32),$chr(44))
  1344. 1344
  1345. 1345 while (%i <= $numtok(%input,44)) {
  1346. 1346 var %c = $gettok(%input,%i,44)
  1347. 1347
  1348. 1348 if (%c != $null) {
  1349. 1349 if ($_barna_is_chan_enabled(%c)) {
  1350. 1350 if (%out == $null) var %out = %c
  1351. 1351 else if (!$istok(%out,%c,44)) var %out = $addtok(%out,%c,44)
  1352. 1352 }
  1353. 1353 }
  1354. 1354
  1355. 1355 inc %i
  1356. 1356 }
  1357. 1357
  1358. 1358 return %out
  1359. 1359}
  1360. 1360
  1361. 1361alias _barna_nick_has_lookup_work {
  1362. 1362 if ($1 == $null) return 0
  1363. 1363
  1364. 1364 var %nick = $1
  1365. 1365 var %ln = $lower(%nick)
  1366. 1366
  1367. 1367 ; Build 106:
  1368. 1368 ; lookup/qry por si solos ya no cuentan como trabajo real. Si no hay cola WHOIP,
  1369. 1369 ; inflight/current ni cola ASN asociada, son estado huerfano y no deben bloquear rescates.
  1370. 1370 if ($_barna_whoip_has_real_work(%nick)) return 1
  1371. 1371 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) return 1
  1372. 1372 if ([ [ $+(%,barna_q_pending.,%ln) ] ] != $null) return 1
  1373. 1373 if ([ [ $+(%,barna_q_active.,%ln) ] ] != $null) return 1
  1374. 1374 if ($_barna_trace_queue_find(%nick) != $null) return 1
  1375. 1375
  1376. 1376 if ([ [ $+(%,barna_lookup.,%ln) ] ] == 1) return 0
  1377. 1377 if ([ [ $+(%,barna_qry.,%ln) ] ] != $null) return 0
  1378. 1378
  1379. 1379 return 0
  1380. 1380}
  1381. 1381
  1382. 1382alias _barna_joinfix_recheck_if_needed {
  1383. 1383 if ($1 == $null) return 0
  1384. 1384
  1385. 1385 var %nick = $1
  1386. 1386 var %reason = $2-
  1387. 1387 var %ln = $lower(%nick)
  1388. 1388
  1389. 1389 if ($_barna_is_privileged_nick(%nick)) {
  1390. 1390 _barna_dbg PRIVSAFE JOINFIX omite nick con @/+v: nick= %nick reason= %reason
  1391. 1391 _barna_privileged_cleanup_nick %nick JOINFIX
  1392. 1392 return 0
  1393. 1393 }
  1394. 1394
  1395. 1395 if ($_barna_nick_has_lookup_work(%nick)) return 0
  1396. 1396
  1397. 1397 var %chans = $_barna_nick_enabled_chans(%nick)
  1398. 1398 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  1399. 1399 if (%chans == $null) return 0
  1400. 1400
  1401. 1401 var %i = 1
  1402. 1402 while (%i <= $numtok(%chans,44)) {
  1403. 1403 var %c = $gettok(%chans,%i,44)
  1404. 1404 if (%c != $null) _barna_seen_add %nick %c
  1405. 1405 inc %i
  1406. 1406 }
  1407. 1407
  1408. 1408 var %lastip = $_barna_ip_get(%nick)
  1409. 1409 if (%lastip != $null) {
  1410. 1410 if ($_barna_asn_cache_apply(%nick,%lastip,%chans)) {
  1411. 1411 _barna_dbg JOINFIX usa cache ASN: nick= %nick ip= %lastip chans= %chans reason= %reason
  1412. 1412 return 1
  1413. 1413 }
  1414. 1414 }
  1415. 1415
  1416. 1416 var %ttl = $_barna_userip_ttl
  1417. 1417 set $+(-u,%ttl) %barna_qry. $+ %ln 1
  1418. 1418 set $+(-u,%ttl) %barna_lookup. $+ %ln 1
  1419. 1419 set $+(-u,%ttl) %barna_lookup_chans. $+ %ln %chans
  1420. 1420 unset %barna_ipdone. $+ %ln
  1421. 1421
  1422. 1422 _barna_dbg JOINFIX reencola nick visto sin consulta activa: nick= %nick chans= %chans reason= %reason
  1423. 1423 _barna_userip_q_add %nick
  1424. 1424
  1425. 1425 return 1
  1426. 1426}
  1427. 1427
  1428. 1428
  1429. 1429; ------------------------------------------------------------
  1430. 1430; BLOQUE 4.6B
  1431. 1431; JOINGUARD ULTRALIGERO PARA JOIN SIN CONSULTA
  1432. 1432; ------------------------------------------------------------
  1433. 1433
  1434. 1434alias _barna_join_guard_count {
  1435. 1435 if (%barna_jguard_items == $null) return 0
  1436. 1436 return $numtok(%barna_jguard_items,44)
  1437. 1437}
  1438. 1438
  1439. 1439alias _barna_join_guard_remove {
  1440. 1440 if ($1 == $null) return 0
  1441. 1441
  1442. 1442 var %ln = $lower($1)
  1443. 1443
  1444. 1444 if (%barna_jguard_items != $null) {
  1445. 1445 var %new = $remtok(%barna_jguard_items,%ln,1,44)
  1446. 1446 if (%new == $null) unset %barna_jguard_items
  1447. 1447 else set %barna_jguard_items %new
  1448. 1448 }
  1449. 1449
  1450. 1450 unset %barna_jguard. $+ %ln
  1451. 1451 unset %barna_jguard_ts. $+ %ln
  1452. 1452 unset %barna_jguard_nick. $+ %ln
  1453. 1453 return 1
  1454. 1454}
  1455. 1455
  1456. 1456alias _barna_join_guard_has_result {
  1457. 1457 if ($1 == $null) return 1
  1458. 1458
  1459. 1459 var %nick = $1
  1460. 1460 var %ln = $lower(%nick)
  1461. 1461
  1462. 1462 ; Build 62:
  1463. 1463 ; IP sola NO es resultado final. El guard solo se da por resuelto
  1464. 1464 ; cuando ya existe ASN real/cache ASN para esa IP, o asn_done=1.
  1465. 1465 if ([ [ $+(%,barna_asn_done.,%ln) ] ] == 1) return 1
  1466. 1466
  1467. 1467 var %ip = $_barna_ip_get(%nick)
  1468. 1468 if (%ip != $null) {
  1469. 1469 var %key = $_barna_asn_cache_key(%ip)
  1470. 1470 if ($_barna_asn_cache_key_valid(%key)) return 1
  1471. 1471 }
  1472. 1472
  1473. 1473 return 0
  1474. 1474}
  1475. 1475
  1476. 1476alias _barna_join_guard_schedule {
  1477. 1477 if (%barna_addon != 1) return
  1478. 1478 if (%barna_join_guard != 1) return
  1479. 1479 if (%barna_jguard_items == $null) return
  1480. 1480 if ($timer(BarnaJoinGuard) != $null) return
  1481. 1481
  1482. 1482 var %delay = %barna_join_guard_delay
  1483. 1483 if (%delay !isnum 3-) var %delay = 7
  1484. 1484 .timerBarnaJoinGuard 1 %delay _barna_join_guard_process
  1485. 1485}
  1486. 1486
  1487. 1487alias _barna_join_guard_add {
  1488. 1488 if (%barna_addon != 1) return 0
  1489. 1489 if (%barna_join_guard != 1) return 0
  1490. 1490 if ($1 == $null) return 0
  1491. 1491
  1492. 1492 var %nick = $1
  1493. 1493 var %ln = $lower(%nick)
  1494. 1494 var %chans = $2-
  1495. 1495
  1496. 1496 if (%chans == $null) var %chans = $_barna_nick_enabled_chans(%nick)
  1497. 1497 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  1498. 1498 if (%chans == $null) return 0
  1499. 1499
  1500. 1500 ; Si ya hay trabajo o IP/cache, no anadimos nada.
  1501. 1501 if ($_barna_join_guard_has_result(%nick)) return 0
  1502. 1502
  1503. 1503 var %ttl = %barna_join_guard_ttl
  1504. 1504 if (%ttl !isnum 10-) var %ttl = 25
  1505. 1505
  1506. 1506 set $+(-u,%ttl) %barna_jguard. $+ %ln %chans
  1507. 1507 set $+(-u,%ttl) %barna_jguard_ts. $+ %ln $ctime
  1508. 1508 set $+(-u,%ttl) %barna_jguard_nick. $+ %ln %nick
  1509. 1509
  1510. 1510 if (!$istok(%barna_jguard_items,%ln,44)) {
  1511. 1511 if (%barna_jguard_items == $null) set $+(-u,%ttl) %barna_jguard_items %ln
  1512. 1512 else set $+(-u,%ttl) %barna_jguard_items $addtok(%barna_jguard_items,%ln,44)
  1513. 1513 }
  1514. 1514
  1515. 1515 ; Limite duro para que nunca crezca sin control en canales grandes.
  1516. 1516 var %max = %barna_join_guard_max
  1517. 1517 if (%max !isnum 20-) var %max = 60
  1518. 1518 while (($numtok(%barna_jguard_items,44) > %max) && (%barna_jguard_items != $null)) {
  1519. 1519 var %old = $gettok(%barna_jguard_items,1,44)
  1520. 1520 noop $_barna_join_guard_remove(%old)
  1521. 1521 }
  1522. 1522
  1523. 1523 _barna_join_guard_schedule
  1524. 1524 return 1
  1525. 1525}
  1526. 1526
  1527. 1527alias _barna_join_guard_process {
  1528. 1528 if (%barna_addon != 1) {
  1529. 1529 .timerBarnaJoinGuard off
  1530. 1530 unset %barna_jguard_items
  1531. 1531 unset %barna_jguard.*
  1532. 1532 unset %barna_jguard_ts.*
  1533. 1533 unset %barna_jguard_nick.*
  1534. 1534 return 0
  1535. 1535 }
  1536. 1536
  1537. 1537 unset %barna_jguard_scheduled
  1538. 1538
  1539. 1539 if (%barna_join_guard != 1) return 0
  1540. 1540 if (%barna_jguard_items == $null) return 0
  1541. 1541
  1542. 1542 var %items = %barna_jguard_items
  1543. 1543 var %now = $ctime
  1544. 1544 var %delay = %barna_join_guard_delay
  1545. 1545 if (%delay !isnum 3-) var %delay = 7
  1546. 1546
  1547. 1547 var %ttl = %barna_join_guard_ttl
  1548. 1548 if (%ttl !isnum 10-) var %ttl = 25
  1549. 1549
  1550. 1550 var %batch = %barna_join_guard_batch
  1551. 1551 if (%batch !isnum 1-) var %batch = 8
  1552. 1552
  1553. 1553 var %newitems
  1554. 1554 var %i = 1
  1555. 1555 var %done = 0
  1556. 1556
  1557. 1557 while (%i <= $numtok(%items,44)) {
  1558. 1558 var %ln = $gettok(%items,%i,44)
  1559. 1559 var %nick = [ [ $+(%,barna_jguard_nick.,%ln) ] ]
  1560. 1560 var %chans = [ [ $+(%,barna_jguard.,%ln) ] ]
  1561. 1561 var %ts = [ [ $+(%,barna_jguard_ts.,%ln) ] ]
  1562. 1562
  1563. 1563 if (%nick == $null) var %nick = %ln
  1564. 1564
  1565. 1565 if (%ts !isnum 1-) {
  1566. 1566 noop $_barna_join_guard_remove(%ln)
  1567. 1567 goto barna_jguard_next
  1568. 1568 }
  1569. 1569
  1570. 1570 var %age = $calc(%now - %ts)
  1571. 1571
  1572. 1572 if (%age < %delay) {
  1573. 1573 if (%newitems == $null) var %newitems = %ln
  1574. 1574 else var %newitems = $addtok(%newitems,%ln,44)
  1575. 1575 goto barna_jguard_next
  1576. 1576 }
  1577. 1577
  1578. 1578 if (%done >= %batch) {
  1579. 1579 if (%newitems == $null) var %newitems = %ln
  1580. 1580 else var %newitems = $addtok(%newitems,%ln,44)
  1581. 1581 goto barna_jguard_next
  1582. 1582 }
  1583. 1583
  1584. 1584 inc %done
  1585. 1585
  1586. 1586 ; Si el nick ya no comparte canal, no hacemos USERIP.
  1587. 1587 if ($comchan(%nick,0) == 0) {
  1588. 1588 noop $_barna_join_guard_remove(%ln)
  1589. 1589 goto barna_jguard_next
  1590. 1590 }
  1591. 1591
  1592. 1592 var %livechans = $_barna_nick_enabled_chans(%nick)
  1593. 1593 if (%livechans == $null) {
  1594. 1594 noop $_barna_join_guard_remove(%ln)
  1595. 1595 goto barna_jguard_next
  1596. 1596 }
  1597. 1597
  1598. 1598 ; Build 55:
  1599. 1599 ; Si ya existe IP/cache/ASN real, quitamos el guard.
  1600. 1600 ; Si solo hay lookup/USERIP pendiente, lo mantenemos hasta el TTL.
  1601. 1601 if ($_barna_join_guard_has_result(%nick)) {
  1602. 1602 noop $_barna_join_guard_remove(%ln)
  1603. 1603 goto barna_jguard_next
  1604. 1604 }
  1605. 1605
  1606. 1606 if (($_barna_nick_has_lookup_work(%nick)) && (%age < %ttl)) {
  1607. 1607 if (%newitems == $null) var %newitems = %ln
  1608. 1608 else var %newitems = $addtok(%newitems,%ln,44)
  1609. 1609 goto barna_jguard_next
  1610. 1610 }
  1611. 1611
  1612. 1612 ; Build 62:
  1613. 1613 ; Rescate unico. Si ya hay IP pero no cache ASN, no repetimos USERIP:
  1614. 1614 ; lanzamos consulta ASN directa. Si no hay IP, pedimos USERIP.
  1615. 1615 var %guard_ip = $_barna_ip_get(%nick)
  1616. 1616
  1617. 1617 if (%guard_ip != $null) {
  1618. 1618 _barna_dbg JOINGUARD rescata IP sin ASN, lanzo consulta ASN directa: nick= %nick ip= %guard_ip chans= %livechans age= %age ttl= %ttl
  1619. 1619 _barna_q_add %nick %guard_ip %livechans
  1620. 1620 }
  1621. 1621 else {
  1622. 1622 set -u90 %barna_qry. $+ %ln 1
  1623. 1623 set -u90 %barna_lookup. $+ %ln 1
  1624. 1624 set -u90 %barna_lookup_chans. $+ %ln %livechans
  1625. 1625 unset %barna_ipdone. $+ %ln
  1626. 1626 unset %barna_userip_sent_recent. $+ %ln
  1627. 1627
  1628. 1628 _barna_dbg JOINGUARD rescata JOIN sin IP/ASN, lanzo WHOIP: nick= %nick chans= %livechans age= %age ttl= %ttl
  1629. 1629 _barna_userip_q_add %nick
  1630. 1630 }
  1631. 1631
  1632. 1632 noop $_barna_join_guard_remove(%ln)
  1633. 1633
  1634. 1634 :barna_jguard_next
  1635. 1635 inc %i
  1636. 1636 }
  1637. 1637
  1638. 1638 if (%newitems != $null) set $+(-u,%ttl) %barna_jguard_items %newitems
  1639. 1639 else {
  1640. 1640 unset %barna_jguard_items
  1641. 1641 _barna_join_guard_gc
  1642. 1642 }
  1643. 1643
  1644. 1644 if (%barna_jguard_items != $null) _barna_join_guard_schedule
  1645. 1645 return %done
  1646. 1646}
  1647. 1647
  1648. 1648alias _barna_join_guard_trim_orphans {
  1649. 1649 ; Build 59:
  1650. 1650 ; En lugar de intentar borrar huerfanas una por una, reconstruimos JOINGUARD
  1651. 1651 ; desde los items reales. Es mas seguro en mSL y evita que vars quede alto.
  1652. 1652 ; Solo toca %barna_jguard* y temporales %barna_tmp_jg_*.
  1653. 1653 ; NO toca %barna_chan.* ni %barna_asn.*.
  1654. 1654
  1655. 1655 var %items = %barna_jguard_items
  1656. 1656
  1657. 1657 if (%items == $null) {
  1658. 1658 if ($var(%barna_jguard*,0) > 0) {
  1659. 1659 .timerBarnaJoinGuard off
  1660. 1660 .unset %barna_jguard*
  1661. 1661 return 1
  1662. 1662 }
  1663. 1663 return 0
  1664. 1664 }
  1665. 1665
  1666. 1666 var %ttl = %barna_join_guard_ttl
  1667. 1667 if (%ttl !isnum 10-) var %ttl = 25
  1668. 1668
  1669. 1669 ; Limpiar temporales previos por seguridad.
  1670. 1670 .unset %barna_tmp_jg_*
  1671. 1671
  1672. 1672 var %saved
  1673. 1673 var %i = 1
  1674. 1674 while (%i <= $numtok(%items,44)) {
  1675. 1675 var %ln = $gettok(%items,%i,44)
  1676. 1676 var %nick = [ [ $+(%,barna_jguard_nick.,%ln) ] ]
  1677. 1677 var %chans = [ [ $+(%,barna_jguard.,%ln) ] ]
  1678. 1678 var %ts = [ [ $+(%,barna_jguard_ts.,%ln) ] ]
  1679. 1679
  1680. 1680 if (%nick == $null) var %nick = %ln
  1681. 1681
  1682. 1682 ; Conservamos solo items con datos minimos y nick aun presente.
  1683. 1683 if ((%ln != $null) && (%chans != $null) && (%ts isnum 1-) && ($comchan(%nick,0) > 0)) {
  1684. 1684 set -u5 %barna_tmp_jg_nick. $+ %ln %nick
  1685. 1685 set -u5 %barna_tmp_jg_chans. $+ %ln %chans
  1686. 1686 if (%saved == $null) var %saved = %ln
  1687. 1687 else var %saved = $addtok(%saved,%ln,44)
  1688. 1688 }
  1689. 1689
  1690. 1690 inc %i
  1691. 1691 }
  1692. 1692
  1693. 1693 ; Borrado amplio de solo JOINGUARD. No toca canales/ASN ni otras colas.
  1694. 1694 .timerBarnaJoinGuard off
  1695. 1695 .unset %barna_jguard*
  1696. 1696
  1697. 1697 ; Restaurar un estado minimo y limpio solo para items reales conservados.
  1698. 1698 if (%saved != $null) {
  1699. 1699 var %i = 1
  1700. 1700 while (%i <= $numtok(%saved,44)) {
  1701. 1701 var %ln = $gettok(%saved,%i,44)
  1702. 1702 var %nick = [ [ $+(%,barna_tmp_jg_nick.,%ln) ] ]
  1703. 1703 var %chans = [ [ $+(%,barna_tmp_jg_chans.,%ln) ] ]
  1704. 1704
  1705. 1705 if ((%nick != $null) && (%chans != $null)) {
  1706. 1706 ; Reusar el add normal para mantener TTL, limite y scheduling.
  1707. 1707 _barna_join_guard_add %nick %chans
  1708. 1708 }
  1709. 1709
  1710. 1710 inc %i
  1711. 1711 }
  1712. 1712 }
  1713. 1713
  1714. 1714 .unset %barna_tmp_jg_*
  1715. 1715 return 1
  1716. 1716}
  1717. 1717alias _barna_join_guard_gc {
  1718. 1718 var %cnt = $var(%barna_jguard*,0)
  1719. 1719 if (%cnt == 0) return 0
  1720. 1720
  1721. 1721 var %items = $_barna_join_guard_count
  1722. 1722 var %max = %barna_join_guard_max
  1723. 1723 if (%max !isnum 20-) var %max = 60
  1724. 1724
  1725. 1725 ; Build 56:
  1726. 1726 ; Si no quedan items reales, o el contador supera el limite,
  1727. 1727 ; limpiamos todos los restos JOINGUARD de forma amplia.
  1728. 1728 ; Esto evita casos items=0 vars>0 timer=OFF tras muchas horas.
  1729. 1729 if ((%items == 0) || (%items > %max)) {
  1730. 1730 .timerBarnaJoinGuard off
  1731. 1731 .unset %barna_jguard*
  1732. 1732 return 1
  1733. 1733 }
  1734. 1734
  1735. 1735 ; Build 59:
  1736. 1736 ; Si hay pocos items reales pero muchas vars residuales,
  1737. 1737 ; reconstruimos JOINGUARD desde los items reales y limpiamos huerfanas.
  1738. 1738 var %expected = $calc((%items * 3) + 6)
  1739. 1739 if (%cnt > %expected) {
  1740. 1740 noop $_barna_join_guard_trim_orphans
  1741. 1741 }
  1742. 1742
  1743. 1743 ; Build 57:
  1744. 1744 ; Si hay items reales pero el timer quedo apagado, lo despertamos.
  1745. 1745 ; No crea variables nuevas ni toca canales/ASN; solo asegura que se procese
  1746. 1746 ; el pequeno lote pendiente del JOINGUARD.
  1747. 1747 if ((%items > 0) && ($timer(BarnaJoinGuard) == $null)) {
  1748. 1748 _barna_join_guard_schedule
  1749. 1749 return 0
  1750. 1750 }
  1751. 1751
  1752. 1752 return 0
  1753. 1753}
  1754. 1754alias barna.jguardclean {
  1755. 1755 .timerBarnaJoinGuard off
  1756. 1756 .unset %barna_jguard*
  1757. 1757 echo -s [ASN] JOINGUARD limpiado. Sin tocar canales/ASN.
  1758. 1758}
  1759. 1759
  1760. 1760alias barna.jguardstatus {
  1761. 1761 ; Build 57: el propio estado despierta el timer si hay items reales y quedo OFF.
  1762. 1762 _barna_join_guard_gc
  1763. 1763 echo -s [ASN] JOINGUARD enabled= %barna_join_guard items= $_barna_join_guard_count vars= $var(%barna_jguard*,0) timer= $iif($timer(BarnaJoinGuard),ON,OFF) delay= %barna_join_guard_delay ttl= %barna_join_guard_ttl max= %barna_join_guard_max batch= %barna_join_guard_batch
  1764. 1764}
  1765. 1765
  1766. 1766
  1767. 1767; ------------------------------------------------------------
  1768. 1768; WHOIPRESCUE: rescate ligero de lookup/qry atascados
  1769. 1769; Build 87: usa WHO/RAW354; no reencola nicks que ya no estan online.
  1770. 1770; ------------------------------------------------------------
  1771. 1771
  1772. 1772alias _barna_userip_stuck_rescue_tick {
  1773. 1773 if (%barna_addon != 1) return 0
  1774. 1774 if (%barna_userip_stuck_rescue != 1) return 0
  1775. 1775 if (%barna_userip_stuck_rescue_busy == 1) return 0
  1776. 1776
  1777. 1777 var %now = $ctime
  1778. 1778 var %secs = %barna_userip_stuck_rescue_secs
  1779. 1779 if (%secs !isnum 1-) var %secs = 1
  1780. 1780
  1781. 1781 if (%barna_userip_stuck_rescue_last != $null) {
  1782. 1782 if ($calc(%now - %barna_userip_stuck_rescue_last) < %secs) return 0
  1783. 1783 }
  1784. 1784
  1785. 1785 set -u8 %barna_userip_stuck_rescue_busy 1
  1786. 1786 set %barna_userip_stuck_rescue_last %now
  1787. 1787
  1788. 1788 var %total = $var(%barna_lookup.*,0)
  1789. 1789 if (%total <= 0) {
  1790. 1790 unset %barna_userip_stuck_rescue_busy
  1791. 1791 return 0
  1792. 1792 }
  1793. 1793
  1794. 1794 var %batch = %barna_userip_stuck_rescue_batch
  1795. 1795 if (%batch !isnum 1-) var %batch = 12
  1796. 1796 if (%batch > 20) var %batch = 20
  1797. 1797
  1798. 1798 var %pos = %barna_userip_stuck_rescue_pos
  1799. 1799 if (%pos !isnum 1-) var %pos = 1
  1800. 1800 if (%pos > %total) var %pos = 1
  1801. 1801
  1802. 1802 var %done = 0
  1803. 1803 var %rescued = 0
  1804. 1804
  1805. 1805 while ((%done < %batch) && (%total > 0)) {
  1806. 1806 if (%pos > %total) var %pos = 1
  1807. 1807
  1808. 1808 var %var = $var(%barna_lookup.*,%pos)
  1809. 1809 var %ln = $remove(%var,$+(%,barna_lookup.))
  1810. 1810 var %nick = [ [ $+(%,barna_userip_q_nick.,%ln) ] ]
  1811. 1811 if (%nick == $null) var %nick = %ln
  1812. 1812
  1813. 1813 if (%ln != $null) {
  1814. 1814 var %livechans = $_barna_nick_enabled_chans(%nick)
  1815. 1815 var %ip = $_barna_ip_get(%nick)
  1816. 1816
  1817. 1817 if ($_barna_is_join_exception(%nick)) {
  1818. 1818 _barna_dbg EXCEPTIONSAFE WHOIPRESCUE omite nick exceptuado: nick= %nick
  1819. 1819 _barna_exception_cleanup_nick %nick
  1820. 1820 inc %done
  1821. 1821 inc %pos
  1822. 1822 continue
  1823. 1823 }
  1824. 1824
  1825. 1825 if ($_barna_is_privileged_nick(%nick)) {
  1826. 1826 _barna_dbg PRIVSAFE WHOIPRESCUE omite nick con @/+v: nick= %nick
  1827. 1827 _barna_privileged_cleanup_nick %nick WHOIPRESCUE
  1828. 1828 inc %done
  1829. 1829 inc %pos
  1830. 1830 continue
  1831. 1831 }
  1832. 1832
  1833. 1833 ; Build 87:
  1834. 1834 ; No usamos lookup_chans/seen como prueba de vida para reencolar WHOIP.
  1835. 1835 ; Si el nick ya salio, esos datos pueden quedar unos segundos y provocar
  1836. 1836 ; consultas inutiles tipo "isn't online". Solo se rescata si $comchan
  1837. 1837 ; confirma que el nick sigue realmente en un canal activo.
  1838. 1838 if (%livechans != $null) {
  1839. 1839 if (%ip != $null) {
  1840. 1840 if ($_barna_fast_asn_if_ip_ready(%nick,WHOIPRESCUE)) {
  1841. 1841 inc %rescued
  1842. 1842 }
  1843. 1843 }
  1844. 1844 else {
  1845. 1845 ; Build 107:
  1846. 1846 ; Si lookup/qry existen pero no hay trabajo WHOIP real, rompemos el estado
  1847. 1847 ; y lanzamos WHO directo igual que /barna.trace. Reencolar por FIFO podia dejar
  1848. 1848 ; de nuevo q_pending/sent_recent sin slot ni consulta viva.
  1849. 1849 if (!$_barna_whoip_has_real_work(%nick)) {
  1850. 1850 var %rttl = %barna_userip_stuck_rescue_recent_ttl
  1851. 1851 if (%rttl !isnum 20-) var %rttl = 60
  1852. 1852
  1853. 1853 set $+(-u,%rttl) %barna_userip_stuck_rescue_recent. $+ %ln 1
  1854. 1854 if ($_barna_trace_force_whoip(%nick,%livechans)) {
  1855. 1855 _barna_dbg WHOIPRESCUE lookup/qry huerfano sin IP, WHO directo: nick= %nick chans= %livechans
  1856. 1856 inc %rescued
  1857. 1857 }
  1858. 1858 }
  1859. 1859 }
  1860. 1860 }
  1861. 1861 else {
  1862. 1862 _barna_dbg WHOIPRESCUE limpia lookup de nick no online: nick= %nick
  1863. 1863 _barna_userip_q_release %nick WHOIPRESCUE_OFFLINE
  1864. 1864 unset %barna_lookup. $+ %ln
  1865. 1865 unset %barna_lookup_chans. $+ %ln
  1866. 1866 unset %barna_qry. $+ %ln
  1867. 1867 unset %barna_ipdone. $+ %ln
  1868. 1868 unset %barna_userip_stuck_rescue_recent. $+ %ln
  1869. 1869 }
  1870. 1870 }
  1871. 1871
  1872. 1872 inc %pos
  1873. 1873 inc %done
  1874. 1874 }
  1875. 1875
  1876. 1876 if (%pos > %total) var %pos = 1
  1877. 1877 set %barna_userip_stuck_rescue_pos %pos
  1878. 1878
  1879. 1879 unset %barna_userip_stuck_rescue_busy
  1880. 1880 return %rescued
  1881. 1881}
  1882. 1882
  1883. 1883alias barna.useriprescuestatus {
  1884. 1884 echo -s [ASN] WHOIPRESCUE enabled= %barna_userip_stuck_rescue lookup= $var(%barna_lookup.*,0) qry= $var(%barna_qry.*,0) recent= $var(%barna_userip_stuck_rescue_recent.*,0) pos= %barna_userip_stuck_rescue_pos secs= %barna_userip_stuck_rescue_secs batch= %barna_userip_stuck_rescue_batch timer= BarnaMaintenance autoscan= %barna_autonickscan scan_recent= $var(%barna_autonickscan_recent.*,0) scan_cpos= %barna_autonickscan_cpos scan_npos= %barna_autonickscan_npos scan_secs= %barna_autonickscan_secs scan_batch= %barna_autonickscan_batch qlimit= %barna_autonickscan_q_limit
  1885. 1885}
  1886. 1886
  1887. 1887alias barna.useriprescueclean {
  1888. 1888 unset %barna_userip_stuck_rescue_recent.*
  1889. 1889 unset %barna_userip_stuck_rescue_pos
  1890. 1890 unset %barna_userip_stuck_rescue_last
  1891. 1891 unset %barna_userip_stuck_rescue_busy
  1892. 1892 echo -s [ASN] WHOIPRESCUE limpiado. Sin tocar canales/ASN.
  1893. 1893}
  1894. 1894
  1895. 1895alias barna.whoiprescuestatus {
  1896. 1896 barna.useriprescuestatus
  1897. 1897}
  1898. 1898
  1899. 1899alias barna.whoiprescueclean {
  1900. 1900 barna.useriprescueclean
  1901. 1901}
  1902. 1902
  1903. 1903alias barna.autoscanstatus {
  1904. 1904 echo -s [ASN] AUTONICKSCAN enabled= %barna_autonickscan JOINONLY= 1 delay_join= %barna_join_delay_secs pending_delay= $_barna_join_delay_count delay_vars= $var(%barna_join_delay_*,0) lightvars= %barna_join_delay_lightvars recent_antiguo= $var(%barna_autonickscan_recent.*,0) whoip_q= $_barna_userip_q_count timer= OFF
  1905. 1905}
  1906. 1906
  1907. 1907alias barna.autoscanclean {
  1908. 1908 unset %barna_autonickscan_recent.*
  1909. 1909 unset %barna_autonickscan_cpos
  1910. 1910 unset %barna_autonickscan_npos
  1911. 1911 unset %barna_autonickscan_last
  1912. 1912 unset %barna_autonickscan_busy
  1913. 1913 echo -s [ASN] AUTONICKSCAN limpiado. Sin tocar canales/ASN.
  1914. 1914}
  1915. 1915
  1916. 1916alias barna.joindelayclean {
  1917. 1917 .unset %barna_join_delay_*
  1918. 1918 echo -s [ASN] JOIN_DELAY limpiado. Sin tocar canales/ASN ni cache ASN.
  1919. 1919}
  1920. 1920
  1921. 1921; ------------------------------------------------------------
  1922. 1922; BLOQUE 4.4C
  1923. 1923; AUTONICKSCAN: rescate ultraligero de nicks online sin JOIN/lookup
  1924. 1924; Build 111: escanea pocos nicks por CoreTick, sin %barna_seen.* persistente.
  1925. 1925; ------------------------------------------------------------
  1926. 1926
  1927. 1927alias -l _barna_autonickscan_skip {
  1928. 1928 if ($1 == $null) return 1
  1929. 1929
  1930. 1930 var %n = $1
  1931. 1931
  1932. 1932 if (%n == $me) return 1
  1933. 1933 if ($_barna_is_join_exception(%n)) return 1
  1934. 1934 if ($_barna_is_privileged_nick(%n)) return 1
  1935. 1935
  1936. 1936 return 0
  1937. 1937}
  1938. 1938
  1939. 1939alias -l _barna_autonickscan_candidate {
  1940. 1940 if ($1 == $null) return 0
  1941. 1941
  1942. 1942 var %nick = $1
  1943. 1943 var %fromchan = $2
  1944. 1944 var %ln = $lower(%nick)
  1945. 1945 var %chans = $_barna_nick_enabled_chans(%nick)
  1946. 1946
  1947. 1947 if ($_barna_autonickscan_skip(%nick)) {
  1948. 1948 if ($_barna_is_privileged_nick(%nick)) _barna_privileged_cleanup_nick %nick AUTONICKSCAN
  1949. 1949 return 0
  1950. 1950 }
  1951. 1951 if (%chans == $null) return 0
  1952. 1952
  1953. 1953 ; Si ya hay IP, no repetir WHOIP: aplicar cache o lanzar ASN directa si falta cache.
  1954. 1954 var %ip = $_barna_ip_get(%nick)
  1955. 1955 if (%ip != $null) {
  1956. 1956 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  1957. 1957 _barna_dbg AUTONICKSCAN aplica cache ASN: nick= %nick ip= %ip chans= %chans from= %fromchan
  1958. 1958 return 1
  1959. 1959 }
  1960. 1960
  1961. 1961 if (($_barna_trace_queue_find(%nick) == $null) && (!$_barna_nick_has_lookup_work(%nick))) {
  1962. 1962 if ([ [ $+(%,barna_autonickscan_recent.,%ln) ] ] == 1) return 0
  1963. 1963
  1964. 1964 var %ttl_ip = %barna_autonickscan_recent_ttl
  1965. 1965 if (%ttl_ip !isnum 30-) var %ttl_ip = 90
  1966. 1966
  1967. 1967 set $+(-u,%ttl_ip) %barna_autonickscan_recent. $+ %ln 1
  1968. 1968 _barna_dbg AUTONICKSCAN IP sin cache, lanza ASN directa: nick= %nick ip= %ip chans= %chans from= %fromchan
  1969. 1969 _barna_q_add %nick %ip %chans
  1970. 1970 _barna_q_process
  1971. 1971 _barna_asn_pump_start_if_needed
  1972. 1972 return 1
  1973. 1973 }
  1974. 1974
  1975. 1975 return 0
  1976. 1976 }
  1977. 1977
  1978. 1978 ; Si no hay IP y no hay trabajo real, reencolar WHOIP limpio.
  1979. 1979 ; No respetamos sent_recent fantasma: el propio AUTONICKSCAN tiene TTL reciente.
  1980. 1980 if ($_barna_nick_has_lookup_work(%nick)) return 0
  1981. 1981 if ($_barna_trace_queue_find(%nick) != $null) return 0
  1982. 1982 if ([ [ $+(%,barna_autonickscan_recent.,%ln) ] ] == 1) return 0
  1983. 1983
  1984. 1984 var %ttl = %barna_autonickscan_recent_ttl
  1985. 1985 if (%ttl !isnum 30-) var %ttl = 90
  1986. 1986
  1987. 1987 set $+(-u,%ttl) %barna_autonickscan_recent. $+ %ln 1
  1988. 1988
  1989. 1989 ; Romper marcas fantasma antes de llamar a _barna_lookup_start, porque
  1990. 1990 ; _barna_userip_q_add no encola si ve sent_recent=1.
  1991. 1991 unset %barna_userip_sent_recent. $+ %ln
  1992. 1992 unset %barna_userip_sent_ts. $+ %ln
  1993. 1993 unset %barna_userip_q_pending. $+ %ln
  1994. 1994 unset %barna_userip_q_chans. $+ %ln
  1995. 1995 unset %barna_ipdone. $+ %ln
  1996. 1996
  1997. 1997 _barna_dbg AUTONICKSCAN reencola WHOIP nick online sin consulta real: nick= %nick chans= %chans from= %fromchan
  1998. 1998 _barna_lookup_start %nick
  1999. 1999
  2000. 2000 return 1
  2001. 2001}
  2002. 2002
  2003. 2003alias -l _barna_autonickscan_tick {
  2004. 2004 if (%barna_addon != 1) return 0
  2005. 2005 if (%barna_autonickscan != 1) return 0
  2006. 2006 if (%barna_autonickscan_busy == 1) return 0
  2007. 2007
  2008. 2008 var %now = $ctime
  2009. 2009 var %secs = %barna_autonickscan_secs
  2010. 2010 if (%secs !isnum 3-) var %secs = 6
  2011. 2011
  2012. 2012 if (%barna_autonickscan_last != $null) {
  2013. 2013 if ($calc(%now - %barna_autonickscan_last) < %secs) return 0
  2014. 2014 }
  2015. 2015
  2016. 2016 var %qlimit = %barna_autonickscan_q_limit
  2017. 2017 if (%qlimit !isnum 10-) var %qlimit = 60
  2018. 2018 if ($_barna_userip_q_count >= %qlimit) return 0
  2019. 2019
  2020. 2020 var %chan_total = $chan(0)
  2021. 2021 if (%chan_total <= 0) return 0
  2022. 2022
  2023. 2023 set -u10 %barna_autonickscan_busy 1
  2024. 2024 set %barna_autonickscan_last %now
  2025. 2025
  2026. 2026 var %batch = %barna_autonickscan_batch
  2027. 2027 if (%batch !isnum 1-) var %batch = 12
  2028. 2028 if (%batch > 12) var %batch = 12
  2029. 2029
  2030. 2030 var %cpos = %barna_autonickscan_cpos
  2031. 2031 var %npos = %barna_autonickscan_npos
  2032. 2032 if (%cpos !isnum 1-) var %cpos = 1
  2033. 2033 if (%npos !isnum 1-) var %npos = 1
  2034. 2034 if (%cpos > %chan_total) var %cpos = 1
  2035. 2035
  2036. 2036 var %done = 0
  2037. 2037 var %rescued = 0
  2038. 2038 var %safety = 0
  2039. 2039 var %safetymax = $calc((%chan_total * 3) + %batch + 10)
  2040. 2040
  2041. 2041 while ((%done < %batch) && (%safety < %safetymax)) {
  2042. 2042 inc %safety
  2043. 2043
  2044. 2044 if ($_barna_userip_q_count >= %qlimit) {
  2045. 2045 var %done = %batch
  2046. 2046 }
  2047. 2047 else {
  2048. 2048 if (%cpos > %chan_total) var %cpos = 1
  2049. 2049
  2050. 2050 var %chan = $chan(%cpos)
  2051. 2051 var %chan = $_barna_chan_name_clean(%chan)
  2052. 2052
  2053. 2053 if ((%chan != $null) && ($_barna_is_chan_enabled(%chan))) {
  2054. 2054 var %ntotal = $nick(%chan,0)
  2055. 2055
  2056. 2056 if (%ntotal > 0) {
  2057. 2057 if (%npos < 1) var %npos = 1
  2058. 2058
  2059. 2059 if (%npos <= %ntotal) {
  2060. 2060 var %nick = $nick(%chan,%npos)
  2061. 2061 inc %npos
  2062. 2062 inc %done
  2063. 2063
  2064. 2064 if (%nick != $null) {
  2065. 2065 if ($_barna_autonickscan_candidate(%nick,%chan)) inc %rescued
  2066. 2066 }
  2067. 2067 }
  2068. 2068 else {
  2069. 2069 inc %cpos
  2070. 2070 var %npos = 1
  2071. 2071 }
  2072. 2072 }
  2073. 2073 else {
  2074. 2074 inc %cpos
  2075. 2075 var %npos = 1
  2076. 2076 }
  2077. 2077 }
  2078. 2078 else {
  2079. 2079 inc %cpos
  2080. 2080 var %npos = 1
  2081. 2081 }
  2082. 2082 }
  2083. 2083 }
  2084. 2084
  2085. 2085 if (%cpos > %chan_total) var %cpos = 1
  2086. 2086 if (%npos < 1) var %npos = 1
  2087. 2087
  2088. 2088 set %barna_autonickscan_cpos %cpos
  2089. 2089 set %barna_autonickscan_npos %npos
  2090. 2090
  2091. 2091 unset %barna_autonickscan_busy
  2092. 2092 return %rescued
  2093. 2093}
  2094. 2094
  2095. 2095; ------------------------------------------------------------
  2096. 2096; SEENGUARD: rescate ligero de nicks vistos sin consulta activa
  2097. 2097; ------------------------------------------------------------
  2098. 2098
  2099. 2099alias _barna_seen_rescue_has_result {
  2100. 2100 if ($1 == $null) return 1
  2101. 2101
  2102. 2102 var %nick = $1
  2103. 2103 var %ln = $lower(%nick)
  2104. 2104
  2105. 2105 ; Build 62:
  2106. 2106 ; IP sola NO basta. Si hay IP pero no cache ASN ni asn_done,
  2107. 2107 ; SEENGUARD debe lanzar consulta ASN directa, no pedir WHOIP de nuevo.
  2108. 2108 if ([ [ $+(%,barna_asn_done.,%ln) ] ] == 1) return 1
  2109. 2109
  2110. 2110 var %ip = $_barna_ip_get(%nick)
  2111. 2111 if (%ip != $null) {
  2112. 2112 var %key = $_barna_asn_cache_key(%ip)
  2113. 2113 if ($_barna_asn_cache_key_valid(%key)) return 1
  2114. 2114 }
  2115. 2115
  2116. 2116 return 0
  2117. 2117}
  2118. 2118
  2119. 2119alias _barna_seen_rescue_tick {
  2120. 2120 ; Build 60:
  2121. 2121 ; Rescate de seguridad para casos tipo "visto_sin_consulta_activa".
  2122. 2122 ; Escanea pocos %barna_seen.* por ciclo y reencola WHOIP una sola vez si:
  2123. 2123 ; - el nick sigue en canal activo comun
  2124. 2124 ; - no tiene IP/cache/ASN real
  2125. 2125 ; - no tiene lookup/USERIP/ASN en curso
  2126. 2126 ; - no fue rescatado recientemente
  2127. 2127 ; No toca %barna_chan.* ni %barna_asn.*.
  2128. 2128
  2129. 2129 if (%barna_addon != 1) return 0
  2130. 2130 if (%barna_seen_rescue != 1) return 0
  2131. 2131 if (%barna_seen_rescue_busy == 1) return 0
  2132. 2132
  2133. 2133 var %now = $ctime
  2134. 2134 var %secs = %barna_seen_rescue_secs
  2135. 2135 if (%secs !isnum 5-) var %secs = 10
  2136. 2136
  2137. 2137 if (%barna_seen_rescue_last != $null) {
  2138. 2138 if ($calc(%now - %barna_seen_rescue_last) < %secs) return 0
  2139. 2139 }
  2140. 2140
  2141. 2141 set -u8 %barna_seen_rescue_busy 1
  2142. 2142 set %barna_seen_rescue_last %now
  2143. 2143
  2144. 2144 var %total = $var(%barna_seen.*,0)
  2145. 2145 if (%total <= 0) {
  2146. 2146 unset %barna_seen_rescue_busy
  2147. 2147 return 0
  2148. 2148 }
  2149. 2149
  2150. 2150 var %batch = %barna_seen_rescue_batch
  2151. 2151 if (%batch !isnum 1-) var %batch = 20
  2152. 2152 if (%batch > 30) var %batch = 30
  2153. 2153
  2154. 2154 var %pos = %barna_seen_rescue_pos
  2155. 2155 if (%pos !isnum 1-) var %pos = 1
  2156. 2156 if (%pos > %total) var %pos = 1
  2157. 2157
  2158. 2158 var %done = 0
  2159. 2159 var %rescued = 0
  2160. 2160
  2161. 2161 while ((%done < %batch) && (%total > 0)) {
  2162. 2162 if (%pos > %total) var %pos = 1
  2163. 2163
  2164. 2164 var %var = $var(%barna_seen.*,%pos)
  2165. 2165 var %ln = $remove(%var,$+(%,barna_seen.))
  2166. 2166 var %nick = %ln
  2167. 2167
  2168. 2168 if (%ln != $null) {
  2169. 2169 var %livechans = $_barna_nick_enabled_chans(%nick)
  2170. 2170
  2171. 2171 if (%livechans != $null) {
  2172. 2172 ; Mantener seen sincronizado con canales vivos.
  2173. 2173 _barna_seen_add %nick $gettok(%livechans,1,44)
  2174. 2174
  2175. 2175 if (!$_barna_seen_rescue_has_result(%nick)) {
  2176. 2176 if (!$_barna_nick_has_lookup_work(%nick)) {
  2177. 2177 if ([ [ $+(%,barna_seen_rescue_recent.,%ln) ] ] != 1) {
  2178. 2178 set -u120 %barna_seen_rescue_recent. $+ %ln 1
  2179. 2179 var %rescue_ip = $_barna_ip_get(%nick)
  2180. 2180
  2181. 2181 if (%rescue_ip != $null) {
  2182. 2182 _barna_dbg SEENGUARD rescata IP sin ASN, lanzo consulta ASN directa: nick= %nick ip= %rescue_ip chans= %livechans
  2183. 2183 _barna_q_add %nick %rescue_ip %livechans
  2184. 2184 }
  2185. 2185 else {
  2186. 2186 set -u90 %barna_lookup. $+ %ln 1
  2187. 2187 set -u90 %barna_lookup_chans. $+ %ln %livechans
  2188. 2188 set -u90 %barna_qry. $+ %ln 1
  2189. 2189 unset %barna_ipdone. $+ %ln
  2190. 2190 unset %barna_userip_sent_recent. $+ %ln
  2191. 2191
  2192. 2192 _barna_dbg SEENGUARD rescata nick visto sin IP/ASN, lanzo WHOIP: nick= %nick chans= %livechans
  2193. 2193 _barna_userip_q_add %nick
  2194. 2194 }
  2195. 2195
  2196. 2196 inc %rescued
  2197. 2197 }
  2198. 2198 }
  2199. 2199 }
  2200. 2200 }
  2201. 2201 }
  2202. 2202
  2203. 2203 inc %pos
  2204. 2204 inc %done
  2205. 2205 }
  2206. 2206
  2207. 2207 if (%pos > %total) var %pos = 1
  2208. 2208 set %barna_seen_rescue_pos %pos
  2209. 2209
  2210. 2210 unset %barna_seen_rescue_busy
  2211. 2211 return %rescued
  2212. 2212}
  2213. 2213
  2214. 2214alias barna.seenguardstatus {
  2215. 2215 echo -s [ASN] SEENGUARD enabled= %barna_seen_rescue seen= $var(%barna_seen.*,0) recent= $var(%barna_seen_rescue_recent.*,0) pos= %barna_seen_rescue_pos secs= %barna_seen_rescue_secs batch= %barna_seen_rescue_batch timer= CoreTick
  2216. 2216}
  2217. 2217
  2218. 2218alias barna.seenguardclean {
  2219. 2219 unset %barna_seen_rescue_recent.*
  2220. 2220 unset %barna_seen_rescue_pos
  2221. 2221 unset %barna_seen_rescue_last
  2222. 2222 unset %barna_seen_rescue_busy
  2223. 2223 echo -s [ASN] SEENGUARD limpiado. Sin tocar canales/ASN ni seen.
  2224. 2224}
  2225. 2225
  2226. 2226alias _barna_joinfix_q_count {
  2227. 2227 var %n = %barna_joinfix_q_count_real
  2228. 2228 if (%n !isnum 1-) return 0
  2229. 2229 return %n
  2230. 2230}
  2231. 2231
  2232. 2232alias _barna_joinfix_q_count_inc {
  2233. 2233 var %n = %barna_joinfix_q_count_real
  2234. 2234 if (%n == $null) var %n = 0
  2235. 2235 inc %n
  2236. 2236 set -u120 %barna_joinfix_q_count_real %n
  2237. 2237}
  2238. 2238
  2239. 2239alias _barna_joinfix_q_count_dec {
  2240. 2240 var %n = %barna_joinfix_q_count_real
  2241. 2241 if (%n == $null) var %n = 0
  2242. 2242 dec %n
  2243. 2243 if (%n < 0) var %n = 0
  2244. 2244 if (%n == 0) unset %barna_joinfix_q_count_real
  2245. 2245 else set -u120 %barna_joinfix_q_count_real %n
  2246. 2246}
  2247. 2247
  2248. 2248alias _barna_joinfix_q_drop_oldest_one {
  2249. 2249 var %head = %barna_joinfix_q_head
  2250. 2250 var %tail = %barna_joinfix_q_tail
  2251. 2251 var %guard = 0
  2252. 2252
  2253. 2253 if ((%head == $null) || (%tail == $null)) return 0
  2254. 2254
  2255. 2255 while ((%head <= %tail) && (%guard < 100)) {
  2256. 2256 inc %guard
  2257. 2257 var %ln = [ [ $+(%,barna_joinfix_q_item.,%head) ] ]
  2258. 2258 unset %barna_joinfix_q_item. $+ %head
  2259. 2259 set %barna_joinfix_q_head $calc(%head + 1)
  2260. 2260
  2261. 2261 if (%ln != $null) {
  2262. 2262 unset %barna_joinfix_q_slot. $+ %ln
  2263. 2263 unset %barna_joinfix_q_pending. $+ %ln
  2264. 2264 unset %barna_joinfix_q_nick. $+ %ln
  2265. 2265 unset %barna_joinfix_q_chans. $+ %ln
  2266. 2266 unset %barna_joinfix_q_ts. $+ %ln
  2267. 2267 _barna_joinfix_q_count_dec
  2268. 2268 return 1
  2269. 2269 }
  2270. 2270
  2271. 2271 var %head = %barna_joinfix_q_head
  2272. 2272 }
  2273. 2273
  2274. 2274 return 0
  2275. 2275}
  2276. 2276
  2277. 2277alias _barna_joinfix_q_shed_if_needed {
  2278. 2278 var %max = %barna_joinfix_q_max_pending
  2279. 2279 var %to = %barna_joinfix_q_shed_to
  2280. 2280 var %cnt = $_barna_joinfix_q_count
  2281. 2281 var %guard = 0
  2282. 2282
  2283. 2283 if (%max !isnum 20-) var %max = 80
  2284. 2284 if (%to !isnum 5-) var %to = 40
  2285. 2285 if (%to >= %max) var %to = $calc(%max - 10)
  2286. 2286 if (%to < 1) var %to = 1
  2287. 2287
  2288. 2288 if (%cnt <= %max) return 0
  2289. 2289
  2290. 2290 while ((%cnt > %to) && (%guard < 200)) {
  2291. 2291 inc %guard
  2292. 2292 if (!$_barna_joinfix_q_drop_oldest_one) break
  2293. 2293 var %cnt = $_barna_joinfix_q_count
  2294. 2294 }
  2295. 2295
  2296. 2296 return 1
  2297. 2297}
  2298. 2298
  2299. 2299alias _barna_joinfix_q_add {
  2300. 2300 if ($1 == $null) return
  2301. 2301
  2302. 2302 var %nick = $1
  2303. 2303 var %ln = $lower(%nick)
  2304. 2304 var %chans = $2-
  2305. 2305
  2306. 2306 if (%chans == $null) var %chans = $_barna_nick_enabled_chans(%nick)
  2307. 2307 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  2308. 2308 if (%chans == $null) return
  2309. 2309
  2310. 2310 if ([ [ $+(%,barna_joinfix_q_pending.,%ln) ] ] == 1) {
  2311. 2311 set -u90 %barna_joinfix_q_chans. $+ %ln %chans
  2312. 2312 set -u90 %barna_joinfix_q_nick. $+ %ln %nick
  2313. 2313 return
  2314. 2314 }
  2315. 2315
  2316. 2316 noop $_barna_joinfix_q_shed_if_needed
  2317. 2317
  2318. 2318 var %tail = %barna_joinfix_q_tail
  2319. 2319 if (%tail !isnum) var %tail = 0
  2320. 2320 inc %tail
  2321. 2321
  2322. 2322 set %barna_joinfix_q_tail %tail
  2323. 2323 if (%barna_joinfix_q_head == $null) set %barna_joinfix_q_head %tail
  2324. 2324
  2325. 2325 set -u90 %barna_joinfix_q_item. $+ %tail %ln
  2326. 2326 set -u90 %barna_joinfix_q_slot. $+ %ln %tail
  2327. 2327 set -u90 %barna_joinfix_q_pending. $+ %ln 1
  2328. 2328 set -u90 %barna_joinfix_q_nick. $+ %ln %nick
  2329. 2329 set -u90 %barna_joinfix_q_chans. $+ %ln %chans
  2330. 2330 set -u90 %barna_joinfix_q_ts. $+ %ln $ctime
  2331. 2331 _barna_joinfix_q_count_inc
  2332. 2332 _barna_core_start
  2333. 2333}
  2334. 2334
  2335. 2335alias _barna_joinfix_q_process {
  2336. 2336 if (%barna_addon != 1) return 0
  2337. 2337
  2338. 2338 var %head = %barna_joinfix_q_head
  2339. 2339 var %tail = %barna_joinfix_q_tail
  2340. 2340 var %batch = %barna_joinfix_q_batch
  2341. 2341 var %done = 0
  2342. 2342 var %guard = 0
  2343. 2343
  2344. 2344 if (%batch !isnum 1-) var %batch = 3
  2345. 2345 if ((%head == $null) || (%tail == $null)) return 0
  2346. 2346
  2347. 2347 while ((%head <= %tail) && (%done < %batch) && (%guard < 200)) {
  2348. 2348 inc %guard
  2349. 2349
  2350. 2350 var %ln = [ [ $+(%,barna_joinfix_q_item.,%head) ] ]
  2351. 2351 unset %barna_joinfix_q_item. $+ %head
  2352. 2352 set %barna_joinfix_q_head $calc(%head + 1)
  2353. 2353
  2354. 2354 if (%ln == $null) {
  2355. 2355 var %head = %barna_joinfix_q_head
  2356. 2356 continue
  2357. 2357 }
  2358. 2358
  2359. 2359 var %nick = [ [ $+(%,barna_joinfix_q_nick.,%ln) ] ]
  2360. 2360 var %chans = [ [ $+(%,barna_joinfix_q_chans.,%ln) ] ]
  2361. 2361 var %ts = [ [ $+(%,barna_joinfix_q_ts.,%ln) ] ]
  2362. 2362
  2363. 2363 unset %barna_joinfix_q_slot. $+ %ln
  2364. 2364 unset %barna_joinfix_q_pending. $+ %ln
  2365. 2365 unset %barna_joinfix_q_nick. $+ %ln
  2366. 2366 unset %barna_joinfix_q_chans. $+ %ln
  2367. 2367 unset %barna_joinfix_q_ts. $+ %ln
  2368. 2368 _barna_joinfix_q_count_dec
  2369. 2369
  2370. 2370 if (%nick == $null) var %nick = %ln
  2371. 2371 if (%ts == $null) var %ts = $ctime
  2372. 2372
  2373. 2373 ; Espera minima para dejar que el JOIN normal y RAW340 hagan su trabajo.
  2374. 2374 if ($calc($ctime - %ts) < 12) {
  2375. 2375 _barna_joinfix_q_add %nick %chans
  2376. 2376 var %head = %barna_joinfix_q_head
  2377. 2377 continue
  2378. 2378 }
  2379. 2379
  2380. 2380 if (%chans == $null) var %chans = $_barna_nick_enabled_chans(%nick)
  2381. 2381 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  2382. 2382 if (%chans == $null) {
  2383. 2383 var %head = %barna_joinfix_q_head
  2384. 2384 inc %done
  2385. 2385 continue
  2386. 2386 }
  2387. 2387
  2388. 2388 if ($_barna_nick_has_lookup_work(%nick)) {
  2389. 2389 ; JOINFIX2:
  2390. 2390 ; Si el nick sigue en USERIP/RAW340/ASN, NO lo damos por resuelto.
  2391. 2391 ; Lo volvemos a vigilar unas cuantas vueltas para detectar el caso:
  2392. 2392 ; USERIP en cola -> no llega RAW340 -> expira lookup -> queda visto_sin_consulta_activa.
  2393. 2393 var %watchtry = [ [ $+(%,barna_joinfix_watchtry.,%ln) ] ]
  2394. 2394 if (%watchtry == $null) var %watchtry = 0
  2395. 2395 inc %watchtry
  2396. 2396
  2397. 2397 var %watchmax = %barna_joinfix_watch_max
  2398. 2398 if (%watchmax !isnum 1-) var %watchmax = 8
  2399. 2399
  2400. 2400 if (%watchtry <= %watchmax) {
  2401. 2401 set -u300 %barna_joinfix_watchtry. $+ %ln %watchtry
  2402. 2402 _barna_joinfix_q_add %nick %chans
  2403. 2403 _barna_dbg JOINFIX mantiene vigilancia: nick= %nick try= %watchtry max= %watchmax chans= %chans
  2404. 2404 }
  2405. 2405 else {
  2406. 2406 unset %barna_joinfix_watchtry. $+ %ln
  2407. 2407 _barna_dbg JOINFIX deja vigilancia por limite: nick= %nick max= %watchmax chans= %chans
  2408. 2408 }
  2409. 2409
  2410. 2410 var %head = %barna_joinfix_q_head
  2411. 2411 inc %done
  2412. 2412 continue
  2413. 2413 }
  2414. 2414
  2415. 2415 unset %barna_joinfix_watchtry. $+ %ln
  2416. 2416
  2417. 2417 if ([ [ $+(%,barna_ipdone.,%ln) ] ] == 1) unset %barna_ipdone. $+ %ln
  2418. 2418
  2419. 2419 noop $_barna_joinfix_recheck_if_needed(%nick,JOINFIX_ORPHAN)
  2420. 2420
  2421. 2421 var %head = %barna_joinfix_q_head
  2422. 2422 inc %done
  2423. 2423 }
  2424. 2424
  2425. 2425 if (%barna_joinfix_q_head > %barna_joinfix_q_tail) {
  2426. 2426 unset %barna_joinfix_q_head
  2427. 2427 unset %barna_joinfix_q_tail
  2428. 2428 unset %barna_joinfix_q_count_real
  2429. 2429 }
  2430. 2430
  2431. 2431 return %done
  2432. 2432}
  2433. 2433
  2434. 2434
  2435. 2435alias _barna_nick_in_seen {
  2436. 2436 if ($1 == $null) return 0
  2437. 2437 if ($2 == $null) return 0
  2438. 2438
  2439. 2439 var %nick = $1
  2440. 2440 var %seen = $2
  2441. 2441 var %i = 1
  2442. 2442
  2443. 2443 while (%i <= $numtok(%seen,44)) {
  2444. 2444 var %c = $gettok(%seen,%i,44)
  2445. 2445
  2446. 2446 if (%c != $null) {
  2447. 2447 if ($me ison %c) {
  2448. 2448 if (%nick ison %c) return 1
  2449. 2449 }
  2450. 2450 }
  2451. 2451
  2452. 2452 inc %i
  2453. 2453 }
  2454. 2454
  2455. 2455 return 0
  2456. 2456}
  2457. 2457
  2458. 2458; ------------------------------------------------------------
  2459. 2459; BLOQUE 3.3
  2460. 2460; CACHE DE PREFIJOS ASN MALOS
  2461. 2461; ------------------------------------------------------------
  2462. 2462
  2463. 2463alias _barna_bad_prefix_active_owners {
  2464. 2464 if ($1 == $null) return
  2465. 2465 if ($2 == $null) return
  2466. 2466
  2467. 2467 var %chan = $1
  2468. 2468 var %owners = $replace($2-,$chr(32),$chr(44))
  2469. 2469 var %out
  2470. 2470 var %i = 1
  2471. 2471
  2472. 2472 ; Builds anteriores guardaban solo valor 1, sin ASN propietario.
  2473. 2473 ; No es seguro sancionar con esas entradas: se consideran obsoletas.
  2474. 2474 if (%owners == 1) return
  2475. 2475
  2476. 2476 while (%i <= $numtok(%owners,44)) {
  2477. 2477 var %asn = $_barna_norm_asn($gettok(%owners,%i,44))
  2478. 2478
  2479. 2479 if ($regex(%asn,/^AS\d+$/i)) {
  2480. 2480 if ($_barna_asn_in_chan(%chan,%asn)) {
  2481. 2481 if (%out == $null) var %out = %asn
  2482. 2482 else if (!$istok(%out,%asn,44)) var %out = $addtok(%out,%asn,44)
  2483. 2483 }
  2484. 2484 }
  2485. 2485
  2486. 2486 inc %i
  2487. 2487 }
  2488. 2488
  2489. 2489 return %out
  2490. 2490}
  2491. 2491
  2492. 2492alias _barna_bad_prefix_prune_channel {
  2493. 2493 if ($1 == $null) return 0
  2494. 2494
  2495. 2495 var %chan = $_barna_chan_name_clean($1)
  2496. 2496 var %key = $_barna_chan_key(%chan)
  2497. 2497 var %ttl = %barna_badpfx_ttl
  2498. 2498 var %changed = 0
  2499. 2499 var %i
  2500. 2500
  2501. 2501 if (%key == $null) return 0
  2502. 2502 if (%ttl !isnum 60-) var %ttl = 7200
  2503. 2503
  2504. 2504 var %i = $var($+(%,barna_badpfx2.,%key,.*),0)
  2505. 2505 while (%i > 0) {
  2506. 2506 var %full = $var($+(%,barna_badpfx2.,%key,.*),%i)
  2507. 2507 var %owners = $var($+(%,barna_badpfx2.,%key,.*),%i).value
  2508. 2508 var %valid = $_barna_bad_prefix_active_owners(%chan,%owners)
  2509. 2509 var %suffix = $remove(%full,$+(%,barna_badpfx2.,%key,.))
  2510. 2510
  2511. 2511 if (%valid == $null) {
  2512. 2512 unset %barna_badpfx2. $+ %key $+ . $+ %suffix
  2513. 2513 inc %changed
  2514. 2514 }
  2515. 2515 else if (%valid != %owners) {
  2516. 2516 set $+(-u,%ttl) %barna_badpfx2. $+ %key $+ . $+ %suffix %valid
  2517. 2517 inc %changed
  2518. 2518 }
  2519. 2519
  2520. 2520 dec %i
  2521. 2521 }
  2522. 2522
  2523. 2523 var %i = $var($+(%,barna_badpfx3.,%key,.*),0)
  2524. 2524 while (%i > 0) {
  2525. 2525 var %full = $var($+(%,barna_badpfx3.,%key,.*),%i)
  2526. 2526 var %owners = $var($+(%,barna_badpfx3.,%key,.*),%i).value
  2527. 2527 var %valid = $_barna_bad_prefix_active_owners(%chan,%owners)
  2528. 2528 var %suffix = $remove(%full,$+(%,barna_badpfx3.,%key,.))
  2529. 2529
  2530. 2530 if (%valid == $null) {
  2531. 2531 unset %barna_badpfx3. $+ %key $+ . $+ %suffix
  2532. 2532 inc %changed
  2533. 2533 }
  2534. 2534 else if (%valid != %owners) {
  2535. 2535 set $+(-u,%ttl) %barna_badpfx3. $+ %key $+ . $+ %suffix %valid
  2536. 2536 inc %changed
  2537. 2537 }
  2538. 2538
  2539. 2539 dec %i
  2540. 2540 }
  2541. 2541
  2542. 2542 return %changed
  2543. 2543}
  2544. 2544
  2545. 2545alias barna.pfxprune {
  2546. 2546 if ($1 != $null) {
  2547. 2547 var %done = $_barna_bad_prefix_prune_channel($1)
  2548. 2548 echo -a [ASN] Prefijos obsoletos revisados en $1 $+ : actualizados/eliminados= %done
  2549. 2549 return
  2550. 2550 }
  2551. 2551
  2552. 2552 var %total = 0
  2553. 2553 var %channels = 0
  2554. 2554 var %i = $var(%barna_chan.*,0)
  2555. 2555
  2556. 2556 while (%i > 0) {
  2557. 2557 var %v = $var(%barna_chan.*,%i)
  2558. 2558 var %key = $remove(%v,$+(%,barna_chan.))
  2559. 2559
  2560. 2560 if (%key != $null) {
  2561. 2561 var %chan = $+($chr(35),%key)
  2562. 2562 var %done = $_barna_bad_prefix_prune_channel(%chan)
  2563. 2563 inc %total %done
  2564. 2564 inc %channels
  2565. 2565 }
  2566. 2566
  2567. 2567 dec %i
  2568. 2568 }
  2569. 2569
  2570. 2570 echo -a [ASN] Prefijos obsoletos revisados en todos los canales: canales= %channels actualizados/eliminados= %total
  2571. 2571}
  2572. 2572
  2573. 2573alias barna.pfxstatus {
  2574. 2574 if ($1 == $null) {
  2575. 2575 echo -a [ASN] PFXSTATUS global: badpfx2= $var(%barna_badpfx2.*,0) badpfx3= $var(%barna_badpfx3.*,0) ttl= %barna_badpfx_ttl
  2576. 2576 echo -a [ASN] Uso: /barna.pfxstatus <#canal> [IP]
  2577. 2577 return
  2578. 2578 }
  2579. 2579
  2580. 2580 var %chan = $_barna_chan_name_clean($1)
  2581. 2581 var %key = $_barna_chan_key(%chan)
  2582. 2582 var %p2n = $var($+(%,barna_badpfx2.,%key,.*),0)
  2583. 2583 var %p3n = $var($+(%,barna_badpfx3.,%key,.*),0)
  2584. 2584 var %ip = $2
  2585. 2585
  2586. 2586 echo -a [ASN] PFXSTATUS canal= %chan key= %key badpfx2= %p2n badpfx3= %p3n ASN_activos= $_barna_get_asn_list(%chan)
  2587. 2587
  2588. 2588 var %i = %p2n
  2589. 2589 while (%i > 0) {
  2590. 2590 var %name = $var($+(%,barna_badpfx2.,%key,.*),%i)
  2591. 2591 var %owners = $var($+(%,barna_badpfx2.,%key,.*),%i).value
  2592. 2592 echo -a [ASN] PFX2 variable= %name owners= %owners owners_activos= $_barna_bad_prefix_active_owners(%chan,%owners)
  2593. 2593 dec %i
  2594. 2594 }
  2595. 2595
  2596. 2596 var %i = %p3n
  2597. 2597 while (%i > 0) {
  2598. 2598 var %name = $var($+(%,barna_badpfx3.,%key,.*),%i)
  2599. 2599 var %owners = $var($+(%,barna_badpfx3.,%key,.*),%i).value
  2600. 2600 echo -a [ASN] PFX3 variable= %name owners= %owners owners_activos= $_barna_bad_prefix_active_owners(%chan,%owners)
  2601. 2601 dec %i
  2602. 2602 }
  2603. 2603
  2604. 2604 if (%ip != $null) {
  2605. 2605 echo -a [ASN] PFXSTATUS prueba IP= %ip pfx2= $_barna_ip_pfx2(%ip) pfx3= $_barna_ip_pfx3(%ip) match_canales= $_barna_bad_prefix_match_chans(%ip,%chan)
  2606. 2606 }
  2607. 2607}
  2608. 2608
  2609. 2609alias _barna_bad_prefix_store {
  2610. 2610 if ($1 == $null) return
  2611. 2611 if ($2 == $null) return
  2612. 2612 if ($3 == $null) return
  2613. 2613
  2614. 2614 var %ip = $1
  2615. 2615 var %asn = $_barna_norm_asn($2)
  2616. 2616 var %chans = $3-
  2617. 2617 var %pfx2 = $_barna_ip_pfx2(%ip)
  2618. 2618 var %pfx3 = $_barna_ip_pfx3(%ip)
  2619. 2619 var %ttl = %barna_badpfx_ttl
  2620. 2620 var %i = 1
  2621. 2621
  2622. 2622 if (!$regex(%asn,/^AS\d+$/i)) return
  2623. 2623 if (%ttl !isnum 60-) var %ttl = 7200
  2624. 2624 if (%chans == $null) return
  2625. 2625
  2626. 2626 var %chans = $replace(%chans,$chr(32),$chr(44))
  2627. 2627
  2628. 2628 while (%i <= $numtok(%chans,44)) {
  2629. 2629 var %c = $_barna_chan_name_clean($gettok(%chans,%i,44))
  2630. 2630 var %key = $_barna_chan_key(%c)
  2631. 2631
  2632. 2632 ; Defensa final: no crear patrones si el ASN ya fue retirado del canal.
  2633. 2633 if ((%key != $null) && ($_barna_asn_in_chan(%c,%asn))) {
  2634. 2634 if (%pfx2 != $null) {
  2635. 2635 var %owners2 = [ [ $+(%,barna_badpfx2.,%key,.,$replace(%pfx2,.,_)) ] ]
  2636. 2636 var %owners2 = $_barna_bad_prefix_active_owners(%c,%owners2)
  2637. 2637 if (%owners2 == $null) var %owners2 = %asn
  2638. 2638 else if (!$istok(%owners2,%asn,44)) var %owners2 = $addtok(%owners2,%asn,44)
  2639. 2639 set $+(-u,%ttl) %barna_badpfx2. $+ %key $+ . $+ $replace(%pfx2,.,_) %owners2
  2640. 2640 _barna_dbg BADPFX guardado por canal/ASN: canal= %c asn= %asn pfx2= %pfx2 owners= %owners2 ttl= %ttl
  2641. 2641 }
  2642. 2642
  2643. 2643 if (%pfx3 != $null) {
  2644. 2644 var %owners3 = [ [ $+(%,barna_badpfx3.,%key,.,$replace(%pfx3,.,_)) ] ]
  2645. 2645 var %owners3 = $_barna_bad_prefix_active_owners(%c,%owners3)
  2646. 2646 if (%owners3 == $null) var %owners3 = %asn
  2647. 2647 else if (!$istok(%owners3,%asn,44)) var %owners3 = $addtok(%owners3,%asn,44)
  2648. 2648 set $+(-u,%ttl) %barna_badpfx3. $+ %key $+ . $+ $replace(%pfx3,.,_) %owners3
  2649. 2649 _barna_dbg BADPFX guardado por canal/ASN: canal= %c asn= %asn pfx3= %pfx3 owners= %owners3 ttl= %ttl
  2650. 2650 }
  2651. 2651 }
  2652. 2652
  2653. 2653 inc %i
  2654. 2654 }
  2655. 2655}
  2656. 2656
  2657. 2657alias _barna_bad_prefix_match_chans {
  2658. 2658 if ($1 == $null) return
  2659. 2659 if ($2 == $null) return
  2660. 2660
  2661. 2661 var %ip = $1
  2662. 2662 var %chans = $2-
  2663. 2663 var %pfx2 = $_barna_ip_pfx2(%ip)
  2664. 2664 var %pfx3 = $_barna_ip_pfx3(%ip)
  2665. 2665 var %ttl = %barna_badpfx_ttl
  2666. 2666 var %out = $null
  2667. 2667 var %i = 1
  2668. 2668
  2669. 2669 if (%ttl !isnum 60-) var %ttl = 7200
  2670. 2670 var %chans = $replace(%chans,$chr(32),$chr(44))
  2671. 2671
  2672. 2672 while (%i <= $numtok(%chans,44)) {
  2673. 2673 var %c = $_barna_chan_name_clean($gettok(%chans,%i,44))
  2674. 2674 var %key = $_barna_chan_key(%c)
  2675. 2675 var %hit = 0
  2676. 2676
  2677. 2677 if (%key != $null) {
  2678. 2678 if (%pfx3 != $null) {
  2679. 2679 var %owners3 = [ [ $+(%,barna_badpfx3.,%key,.,$replace(%pfx3,.,_)) ] ]
  2680. 2680 var %valid3 = $_barna_bad_prefix_active_owners(%c,%owners3)
  2681. 2681
  2682. 2682 if (%valid3 != $null) {
  2683. 2683 var %hit = 1
  2684. 2684 if (%valid3 != %owners3) set $+(-u,%ttl) %barna_badpfx3. $+ %key $+ . $+ $replace(%pfx3,.,_) %valid3
  2685. 2685 }
  2686. 2686 else if (%owners3 != $null) {
  2687. 2687 unset %barna_badpfx3. $+ %key $+ . $+ $replace(%pfx3,.,_)
  2688. 2688 }
  2689. 2689 }
  2690. 2690
  2691. 2691 if (%pfx2 != $null) {
  2692. 2692 var %owners2 = [ [ $+(%,barna_badpfx2.,%key,.,$replace(%pfx2,.,_)) ] ]
  2693. 2693 var %valid2 = $_barna_bad_prefix_active_owners(%c,%owners2)
  2694. 2694
  2695. 2695 if (%valid2 != $null) {
  2696. 2696 var %hit = 1
  2697. 2697 if (%valid2 != %owners2) set $+(-u,%ttl) %barna_badpfx2. $+ %key $+ . $+ $replace(%pfx2,.,_) %valid2
  2698. 2698 }
  2699. 2699 else if (%owners2 != $null) {
  2700. 2700 unset %barna_badpfx2. $+ %key $+ . $+ $replace(%pfx2,.,_)
  2701. 2701 }
  2702. 2702 }
  2703. 2703
  2704. 2704 if (%hit == 1) {
  2705. 2705 if (%out == $null) var %out = %c
  2706. 2706 else if (!$istok(%out,%c,44)) var %out = $addtok(%out,%c,44)
  2707. 2707 }
  2708. 2708 }
  2709. 2709
  2710. 2710 inc %i
  2711. 2711 }
  2712. 2712
  2713. 2713 return %out
  2714. 2714}
  2715. 2715
  2716. 2716alias _barna_ip_known_bad_prefix {
  2717. 2717 if ($1 == $null) return 0
  2718. 2718 if ($2 == $null) return 0
  2719. 2719
  2720. 2720 if ($_barna_bad_prefix_match_chans($1,$2-) != $null) return 1
  2721. 2721
  2722. 2722 return 0
  2723. 2723}
  2724. 2724
  2725. 2725alias _barna_bad_prefix_punish {
  2726. 2726 if ($1 == $null) return
  2727. 2727 if ($2 == $null) return
  2728. 2728
  2729. 2729 var %nick = $1
  2730. 2730 var %ip = $2
  2731. 2731 var %src = $3
  2732. 2732 var %inputchans = $4-
  2733. 2733 var %ln = $lower(%nick)
  2734. 2734 var %chans
  2735. 2735 var %showchans
  2736. 2736
  2737. 2737 if ($_barna_is_privileged_nick(%nick)) {
  2738. 2738 _barna_dbg PRIVSAFE BADPFX ignorado por @/+v: nick= %nick ip= %ip src= %src
  2739. 2739 _barna_privileged_cleanup_nick %nick BADPFX
  2740. 2740 return
  2741. 2741 }
  2742. 2742
  2743. 2743 if (%inputchans == $null) var %inputchans = $_barna_seen_get(%nick)
  2744. 2744
  2745. 2745 var %allchans = $_barna_echo_chans_for_nick(%nick,%inputchans)
  2746. 2746 if (%allchans != $null) var %inputchans = %allchans
  2747. 2747
  2748. 2748 var %chans = $_barna_bad_prefix_match_chans(%ip,%inputchans)
  2749. 2749
  2750. 2750 if (%chans == $null) {
  2751. 2751 _barna_dbg BADPFX ignorado, prefijo no corresponde a este canal: nick= %nick ip= %ip src= %src chans= %inputchans
  2752. 2752 return
  2753. 2753 }
  2754. 2754
  2755. 2755 _barna_dbg RAW340 prefijo ASN malo conocido por canal, SHUN por nick y SAQUIT diferido: nick= %nick ip= %ip src= %src chans= %chans
  2756. 2756
  2757. 2757 var %showchans = $replace(%chans,$chr(44),$+(,$chr(32)))
  2758. 2758
  2759. 2759 var %msg = El usuario $chr(2) $+ %nick $+ $chr(15) (IP: $+ $chr(2) $+ %ip $+ $chr(15) $+ ) coincide con prefijo ASN malo conocido en este canal
  2760. 2760
  2761. 2761 var %ei = 1
  2762. 2762 while (%ei <= $numtok(%inputchans,44)) {
  2763. 2763 var %ec = $gettok(%inputchans,%ei,44)
  2764. 2764
  2765. 2765 if (%ec != $null) {
  2766. 2766 _barna_channel_echo %ec %msg
  2767. 2767 }
  2768. 2768
  2769. 2769 inc %ei
  2770. 2770 }
  2771. 2771
  2772. 2772 set -u900 %barna_saquit_showchans. $+ %ln %showchans
  2773. 2773 set -u900 %barna_saquit_msg. $+ %ln %msg
  2774. 2774
  2775. 2775 _barna_dbg Parseline2 pendiente hasta QUIT por SAQUIT: nick= %nick ip= %ip src= %src chans= %chans
  2776. 2776
  2777. 2777 _barna_mark_badnick %nick %ip %chans
  2778. 2778 _barna_shun_ip %ip Molestias en Canales (A)
  2779. 2779 _barna_shun_nick %nick Molestias en Canales (A)
  2780. 2780 _barna_schedule_delayed_saquit %nick %ip %chans
  2781. 2781}
  2782. 2782
  2783. 2783; ------------------------------------------------------------
  2784. 2784; BLOQUE 4
  2785. 2785; DIALOGO ORIGINAL
  2786. 2786; ------------------------------------------------------------
  2787. 2787
  2788. 2788dialog barna_ctl {
  2789. 2789 title "Addon [ASN] (ISP/ASN)"
  2790. 2790 size -1 -1 170 72
  2791. 2791 option dbu
  2792. 2792 text "Estado:", 1, 8 10 28 10
  2793. 2793 edit "", 2, 40 9 120 12, read autohs
  2794. 2794 button "Encender", 3, 8 30 60 14
  2795. 2795 button "Apagar", 4, 76 30 60 14
  2796. 2796 button "Cerrar", 6, 56 50 56 14, ok
  2797. 2797}
  2798. 2798
  2799. 2799alias barna {
  2800. 2800 if (!$dialog(barna_ctl)) dialog -m barna_ctl barna_ctl
  2801. 2801}
  2802. 2802
  2803. 2803alias _barna_refresh {
  2804. 2804 if ($dialog(barna_ctl)) {
  2805. 2805 if (%barna_addon == 1) {
  2806. 2806 dialog -t barna_ctl Addon [ASN] (ISP/ASN) - ACTIVADO
  2807. 2807 did -ra barna_ctl 2 ACTIVADO
  2808. 2808 did -b barna_ctl 3
  2809. 2809 did -e barna_ctl 4
  2810. 2810 }
  2811. 2811 else {
  2812. 2812 dialog -t barna_ctl Addon [ASN] (ISP/ASN) - DESACTIVADO
  2813. 2813 did -ra barna_ctl 2 DESACTIVADO
  2814. 2814 did -e barna_ctl 3
  2815. 2815 did -b barna_ctl 4
  2816. 2816 }
  2817. 2817 }
  2818. 2818}
  2819. 2819
  2820. 2820on *:DIALOG:barna_ctl:init:*:{
  2821. 2821 _barna_refresh
  2822. 2822}
  2823. 2823
  2824. 2824on *:DIALOG:barna_ctl:sclick:3:{
  2825. 2825 set %barna_addon 1
  2826. 2826 _barna_autostart manual
  2827. 2827 echo -s [ASN] Addon ACTIVADO
  2828. 2828 _barna_refresh
  2829. 2829}
  2830. 2830
  2831. 2831on *:DIALOG:barna_ctl:sclick:4:{
  2832. 2832 set %barna_addon 0
  2833. 2833 _barna_core_stop_timers
  2834. 2834 echo -s [ASN] Addon DESACTIVADO
  2835. 2835 _barna_refresh
  2836. 2836}
  2837. 2837
  2838. 2838alias _barna_toggle {
  2839. 2839 if (%barna_addon == 1) {
  2840. 2840 set %barna_addon 0
  2841. 2841 _barna_core_stop_timers
  2842. 2842 echo -s [ASN] Addon DESACTIVADO
  2843. 2843 }
  2844. 2844 else {
  2845. 2845 set %barna_addon 1
  2846. 2846 _barna_autostart manual
  2847. 2847 echo -s [ASN] Addon ACTIVADO
  2848. 2848 }
  2849. 2849 _barna_refresh
  2850. 2850}
  2851. 2851
  2852. 2852; ------------------------------------------------------------
  2853. 2853; BLOQUE 5
  2854. 2854; POPUPS Y MENUS
  2855. 2855; ------------------------------------------------------------
  2856. 2856
  2857. 2857menu status {
  2858. 2858 -
  2859. 2859 Addon ISP / ASN
  2860. 2860 .Abrir panel:/barna
  2861. 2861 .Toggle global:/_barna_toggle
  2862. 2862 -
  2863. 2863 Debug
  2864. 2864 .Activar Debug:/_barna_debug_on
  2865. 2865 .Desactivar Debug:/_barna_debug_off
  2866. 2866 .Activar Debug detallado:/_barna_debug_verbose_on
  2867. 2867 .Desactivar Debug detallado:/_barna_debug_verbose_off
  2868. 2868 .Activar Debug RX:/_barna_debug_rx_on
  2869. 2869 .Desactivar Debug RX:/_barna_debug_rx_off
  2870. 2870 -
  2871. 2871}
  2872. 2872
  2873. 2873menu channel {
  2874. 2874 -
  2875. 2875 Addon ISP / ASN
  2876. 2876 .Abrir panel:/barna
  2877. 2877 .Toggle global:/_barna_toggle
  2878. 2878 .-
  2879. 2879 .Este canal
  2880. 2880 ..Activar canal:/_barna_chan_on $active
  2881. 2881 ..Desactivar canal:/_barna_chan_off $active
  2882. 2882 ..Toggle canal:/_barna_chan_toggle $active
  2883. 2883 ..Ver ASN del canal:/_barna_chan_list_asn $active
  2884. 2884 ..Añadir ASN al canal:/_barna_chan_add_asn_input $active
  2885. 2885 ..Borrar ASN del canal:/_barna_chan_del_asn_input $active
  2886. 2886 .-
  2887. 2887 .Debug
  2888. 2888 ..Activar Debug:/_barna_debug_on
  2889. 2889 ..Desactivar Debug:/_barna_debug_off
  2890. 2890 ..Activar Debug detallado:/_barna_debug_verbose_on
  2891. 2891 ..Desactivar Debug detallado:/_barna_debug_verbose_off
  2892. 2892 ..Activar Debug RX:/_barna_debug_rx_on
  2893. 2893 ..Desactivar Debug RX:/_barna_debug_rx_off
  2894. 2894 -
  2895. 2895}
  2896. 2896
  2897. 2897; ------------------------------------------------------------
  2898. 2898; BLOQUE 6
  2899. 2899; LIMPIEZAS
  2900. 2900; ------------------------------------------------------------
  2901. 2901
  2902. 2902alias barna.qreset {
  2903. 2903 unset %barna_q_*
  2904. 2904 unset %barna_lookup.*
  2905. 2905 unset %barna_lookup_timer.*
  2906. 2906 unset %barna_ipdone.*
  2907. 2907 unset %barna_sock.*
  2908. 2908 unset %barna_rx.*
  2909. 2909 unset %barna_asn_done.*
  2910. 2910 unset %asn_val.*
  2911. 2911 unset %as_name_val.*
  2912. 2912 unset %temp_ip_*
  2913. 2913 unset %barna_abort.*
  2914. 2914 unset %barna_userip_retry.*
  2915. 2915 unset %barna_seen.*
  2916. 2916 unset %barna_saquit_ip.*
  2917. 2917 unset %barna_saquit_chans.*
  2918. 2918 unset %barna_saquit_pending.*
  2919. 2919 unset %barna_saquit_timer.*
  2920. 2920 unset %barna_saquit_sent.*
  2921. 2921 unset %barna_saquit_msg.*
  2922. 2922 unset %barna_saquit_showchans.*
  2923. 2923 unset %barna_saquit_q_*
  2924. 2924 unset %barna_hunted.*
  2925. 2925 unset %barna_parseline_done.*
  2926. 2926 unset %barna_badnick.*
  2927. 2927 unset %barna_badnick_ip.*
  2928. 2928 unset %barna_badnick_chans.*
  2929. 2929 unset %barna_q_deferred.*
  2930. 2930 unset %barna_q_low.*
  2931. 2931 unset %barna_q_retry_timer.*
  2932. 2932 unset %barna_q_totimer.*
  2933. 2933 unset %barna_sock_timeout_seen.*
  2934. 2934 unset %barna_userip_q_pending.*
  2935. 2935 unset %barna_userip_q_nick.*
  2936. 2936 unset %barna_userip_q_slot.*
  2937. 2937 unset %barna_userip_q_item.*
  2938. 2938 unset %barna_userip_q_active
  2939. 2939 unset %barna_userip_q_running
  2940. 2940 unset %barna_userip_q_head
  2941. 2941 unset %barna_userip_q_tail
  2942. 2942 unset %barna_userip_q_count_real
  2943. 2943 unset %barna_userip_drop_count
  2944. 2944 unset %barna_userip_q_scheduled
  2945. 2945 unset %barna_userip_inflight.*
  2946. 2946 unset %barna_userip_inflight_count
  2947. 2947 unset %barna_userip_sent_ts.*
  2948. 2948 unset %barna_userip_watchtry.*
  2949. 2949 unset %barna_userip_watchdog_scheduled
  2950. 2950 unset %barna_userip_watch_q_item.*
  2951. 2951 unset %barna_userip_watch_q_head
  2952. 2952 unset %barna_userip_watch_q_tail
  2953. 2953 unset %barna_userip_watch_q_slot.*
  2954. 2954 unset %barna_userip_watch_q_count_real
  2955. 2955 unset %barna_userip_slow_retry.*
  2956. 2956 unset %barna_userip_slow_timer.*
  2957. 2957 unset %barna_userip_sent_recent.*
  2958. 2958 unset %barna_q_running
  2959. 2959 unset %barna_q_items
  2960. 2960 unset %barna_q_scheduled
  2961. 2961 unset %barna_q_prune_last
  2962. 2962 unset %barna_q_low_items
  2963. 2963 .timerBarnaASNPump off
  2964. 2964 unset %barna_asn_pump_running
  2965. 2965 unset %barna_asn_pump_last
  2966. 2966 unset %barna_asn_pump_armed
  2967. 2967 unset %barna_echo_q_chan.*
  2968. 2968 unset %barna_echo_q_msg.*
  2969. 2969 unset %barna_echo_q_head
  2970. 2970 unset %barna_echo_q_tail
  2971. 2971 unset %barna_echo_q_running
  2972. 2972 unset %barna_echo_q_scheduled
  2973. 2973 unset %barna_join_audit_q_item.*
  2974. 2974 unset %barna_join_audit_q_slot.*
  2975. 2975 unset %barna_join_audit_q_head
  2976. 2976 unset %barna_join_audit_q_tail
  2977. 2977 unset %barna_join_audit_q_count_real
  2978. 2978 unset %barna_join_audit_q_scheduled
  2979. 2979 unset %barna_join_audit_nick.*
  2980. 2980 unset %barna_join_audit_chans.*
  2981. 2981 unset %barna_join_audit_ts.*
  2982. 2982 unset %barna_join_audit_try.*
  2983. 2983 unset %barna_joinfix_q_item.*
  2984. 2984 unset %barna_joinfix_q_slot.*
  2985. 2985 unset %barna_joinfix_q_pending.*
  2986. 2986 unset %barna_joinfix_q_nick.*
  2987. 2987 unset %barna_joinfix_q_chans.*
  2988. 2988 unset %barna_joinfix_q_ts.*
  2989. 2989 unset %barna_joinfix_watchtry.*
  2990. 2990 unset %barna_joinfix_q_head
  2991. 2991 unset %barna_joinfix_q_tail
  2992. 2992 unset %barna_joinfix_q_count_real
  2993. 2993 unset %barna_last_ip.*
  2994. 2994 unset %barna_core_tick_running
  2995. 2995 unset %barna_core_tick_busy
  2996. 2996 unset %barna_manual_userip.*
  2997. 2997 unset %barna_manual_userip_win.*
  2998. 2998 unset %barna_trace_last.*
  2999. 2999 echo -s [ASN] Estado temporal ASN reiniciado.
  3000. 3000 _barna_core_ensure_timers
  3001. 3001}
  3002. 3002
  3003. 3003alias barna.treset {
  3004. 3004 .timerBarna* off
  3005. 3005 .timerBarnaLookup_* off
  3006. 3006 .timerBarnaUserIPBatch off
  3007. 3007 .timerBarnaUserIPWatchdog off
  3008. 3008 .timerBarnaASNQ off
  3009. 3009 .timerBarnaASNPump off
  3010. 3010 .timerBarnaEchoQ off
  3011. 3011 .timerBarnaJoinAudit off
  3012. 3012 .timerBarnaSockTO_* off
  3013. 3013 .timerBarnaQRetry_* off
  3014. 3014 .timerBarnaUserIP_* off
  3015. 3015 .timerBarnaUserIPSlow_* off
  3016. 3016 .timerBarnaSAQUIT_* off
  3017. 3017 .timerBarnaSAQUITPump off
  3018. 3018 .timerBarnaCheck_* off
  3019. 3019 .timerBarnaFinal_* off
  3020. 3020 echo -s [ASN] Timers del addon ASN reiniciados.
  3021. 3021}
  3022. 3022
  3023. 3023alias barna.postupdate {
  3024. 3024 echo -s [ASN] POSTUPDATE inicio: limpieza segura tras cambiar de build. No toca canales/ASN.
  3025. 3025
  3026. 3026 ; Apaga solo timers del addon ASN. No usar /timers off global.
  3027. 3027 barna.treset
  3028. 3028
  3029. 3029 ; Limpieza de estado temporal especifico de WHOIP/RAW354 y arranques previos.
  3030. 3030 .unset %barna_whoip_*
  3031. 3031 ; Build 95: purga de familias temporales antiguas que no deben sobrevivir al flush.
  3032. 3032 .unset %barna_userip_watch_*
  3033. 3033 .unset %barna_userip_watch_q_*
  3034. 3034 .unset %barna_whoip_fifo*
  3035. 3035 .unset %barna_whoip_token*
  3036. 3036 .unset %barna_whoip_sent.*
  3037. 3037 .unset %barna_whoip_315_*
  3038. 3038 .unset %barna_tmp_*
  3039. 3039 .unset %barna_hygiene_*
  3040. 3040 .unset %barna_abort.*
  3041. 3041 .unset %barna_privileged.*
  3042. 3042 .unset %barna_hunted.*
  3043. 3043 .unset %barna_badpfx2.*
  3044. 3044 .unset %barna_badpfx3.*
  3045. 3045 .unset %barna_badnick.*
  3046. 3046 .unset %barna_badnick_ip.*
  3047. 3047 .unset %barna_badnick_chans.*
  3048. 3048 .unset %barna_userip_inflight.*
  3049. 3049 .unset %barna_userip_inflight_count
  3050. 3050 .unset %barna_userip_q_scheduled
  3051. 3051 .unset %barna_userip_q_active
  3052. 3052 .unset %barna_userip_q_running
  3053. 3053 .unset %barna_core_tick_running
  3054. 3054 .unset %barna_core_tick_busy
  3055. 3055 .unset %barna_maintenance_busy
  3056. 3056 .unset %barna_maintenance_phase
  3057. 3057 .unset %barna_cachecap117_drain_requested
  3058. 3058 .unset %barna_seen_rescue_busy
  3059. 3059 .unset %barna_autonickscan_recent.*
  3060. 3060 .unset %barna_autonickscan_cpos
  3061. 3061 .unset %barna_autonickscan_npos
  3062. 3062 .unset %barna_autonickscan_last
  3063. 3063 .unset %barna_autonickscan_busy
  3064. 3064 .unset %barna_join_delay_*
  3065. 3065 .unset %barna_manual_userip.*
  3066. 3066 .unset %barna_manual_userip_win.*
  3067. 3067
  3068. 3068 ; Build 95: purga de familias temporales antiguas que no deben sobrevivir al cambio.
  3069. 3069 .unset %barna_userip_watch_*
  3070. 3070 .unset %barna_userip_watch_q_*
  3071. 3071 .unset %barna_whoip_fifo*
  3072. 3072 .unset %barna_whoip_token*
  3073. 3073 .unset %barna_whoip_sent.*
  3074. 3074 .unset %barna_whoip_315_*
  3075. 3075 .unset %barna_tmp_*
  3076. 3076 .unset %barna_hygiene_*
  3077. 3077 .unset %barna_abort.*
  3078. 3078 .unset %barna_privileged.*
  3079. 3079 .unset %barna_hunted.*
  3080. 3080 .unset %barna_badpfx2.*
  3081. 3081 .unset %barna_badpfx3.*
  3082. 3082 .unset %barna_badnick.*
  3083. 3083 .unset %barna_badnick_ip.*
  3084. 3084 .unset %barna_badnick_chans.*
  3085. 3085
  3086. 3086 ; Build 92: limpieza anti-lag fuerte de temporales voluminosos.
  3087. 3087 ; NO toca %barna_chan.* ni %barna_asn.*
  3088. 3088 .unset %barna_echo_asn_seen.*
  3089. 3089 .unset %barna_echo_seen.*
  3090. 3090 .unset %barna_seen_rescue_recent.*
  3091. 3091 .unset %barna_seen_rescue_pos
  3092. 3092 .unset %barna_seen_rescue_last
  3093. 3093 .unset %barna_seen_display.*
  3094. 3094 .unset %barna_seen.*
  3095. 3095 .unset %barna_ip_keep.*
  3096. 3096 .unset %barna_lookup.*
  3097. 3097 .unset %barna_lookup_chans.*
  3098. 3098 .unset %barna_lookup_timer.*
  3099. 3099 .unset %barna_qry.*
  3100. 3100 .unset %barna_ipdone.*
  3101. 3101 .unset %barna_last_ip.*
  3102. 3102 .unset %barna_jguard_items
  3103. 3103 .unset %barna_jguard.*
  3104. 3104 .unset %barna_jguard_ts.*
  3105. 3105 .unset %barna_jguard_nick.*
  3106. 3106
  3107. 3107 .unset %barna_userip_q_pending.*
  3108. 3108 .unset %barna_userip_q_nick.*
  3109. 3109 .unset %barna_userip_q_slot.*
  3110. 3110 .unset %barna_userip_q_chans.*
  3111. 3111 .unset %barna_userip_q_item.*
  3112. 3112 .unset %barna_userip_q_head
  3113. 3113 .unset %barna_userip_q_tail
  3114. 3114 .unset %barna_userip_q_count_real
  3115. 3115 .unset %barna_echo_q_*
  3116. 3116
  3117. 3117 ; Build 98: purga extra de estado socket/ASN/WHOIP que puede crecer aunque no haya sockets reales.
  3118. 3118 .unset %barna_sock.*
  3119. 3119 .unset %barna_sock_name.*
  3120. 3120 .unset %barna_sock_nick.*
  3121. 3121 .unset %barna_sock_ip.*
  3122. 3122 .unset %barna_sock_id.*
  3123. 3123 .unset %barna_sock_expected.*
  3124. 3124 .unset %barna_sock_opened.*
  3125. 3125 .unset %barna_sock_timeout_seen.*
  3126. 3126 .unset %barna_rx.*
  3127. 3127 .unset %barna_asn_done.*
  3128. 3128 .unset %barna_q_finished.*
  3129. 3129 .unset %temp_ip_*
  3130. 3130 .unset %asn_val.*
  3131. 3131 .unset %as_name_val.*
  3132. 3132 .unset %barna_userip_sent_recent.*
  3133. 3133 .unset %barna_userip_sent_ts.*
  3134. 3134 .unset %barna_userip_retry.*
  3135. 3135 .unset %barna_userip_watchtry.*
  3136. 3136 .unset %barna_userip_current_*
  3137. 3137 .unset %barna_whoip_current_*
  3138. 3138
  3139. 3139 .unset %barna_joinfix_q_*
  3140. 3140 .unset %barna_joinfix_*
  3141. 3141 .unset %barna_joinfix*
  3142. 3142
  3143. 3143
  3144. 3144 ; Build 98: purga extra de estado socket/ASN/WHOIP que puede crecer aunque no haya sockets reales.
  3145. 3145 .unset %barna_sock.*
  3146. 3146 .unset %barna_sock_name.*
  3147. 3147 .unset %barna_sock_nick.*
  3148. 3148 .unset %barna_sock_ip.*
  3149. 3149 .unset %barna_sock_id.*
  3150. 3150 .unset %barna_sock_expected.*
  3151. 3151 .unset %barna_sock_opened.*
  3152. 3152 .unset %barna_sock_timeout_seen.*
  3153. 3153 .unset %barna_rx.*
  3154. 3154 .unset %barna_asn_done.*
  3155. 3155 .unset %barna_q_finished.*
  3156. 3156 .unset %temp_ip_*
  3157. 3157 .unset %asn_val.*
  3158. 3158 .unset %as_name_val.*
  3159. 3159 .unset %barna_userip_sent_recent.*
  3160. 3160 .unset %barna_userip_sent_ts.*
  3161. 3161 .unset %barna_userip_retry.*
  3162. 3162 .unset %barna_userip_watchtry.*
  3163. 3163 .unset %barna_userip_current_*
  3164. 3164 .unset %barna_whoip_current_*
  3165. 3165
  3166. 3166 ; Limpiezas suaves ya existentes. No borran canales ni ASN configurados.
  3167. 3167 barna.sockvarclean
  3168. 3168 barna.saquitfix
  3169. 3169
  3170. 3170 ; Build 93: FIFO directo sin escaneos ni descartes.
  3171. 3171 set %barna_userip_q_batch_max 2
  3172. 3172 set %barna_userip_turbo_threshold 10
  3173. 3173 set %barna_userip_turbo_batch_max 3
  3174. 3174 set %barna_userip_emergency_threshold 30
  3175. 3175 set %barna_userip_emergency_batch_max 3
  3176. 3176 set %barna_userip_q_max_pending 400
  3177. 3177 set %barna_userip_q_shed_to 0
  3178. 3178 set %barna_userip_no_shed 1
  3179. 3179 if (%barna_userip_state_ttl == $null) set %barna_userip_state_ttl 60
  3180. 3180 if (%barna_userip_state_ttl > 60) set %barna_userip_state_ttl 60
  3181. 3181 if (%barna_userip_state_ttl < 30) set %barna_userip_state_ttl 30
  3182. 3182 set %barna_userip_stuck_rescue 1
  3183. 3183 set %barna_autonickscan 0
  3184. 3184 set %barna_join_guard 0
  3185. 3185 set %barna_seen_rescue 0
  3186. 3186 set %barna_core_minimal 1
  3187. 3187 set %barna_whoip_lightvars 1
  3188. 3188 set %barna_echo_dedupe_secs 90
  3189. 3189 set %barna_total_max_vars 900
  3190. 3190 set %barna_seen_max_vars 0
  3191. 3191 set %barna_echo_seen_max_vars 40
  3192. 3192 set %barna_echo_asn_seen_max_vars 120
  3193. 3193 set %barna_ip_keep_max_vars 80
  3194. 3194 set %barna_sockvar_max_vars 25
  3195. 3195 set %barna_echo_asn_seen_max_vars 120
  3196. 3196 set %barna_ip_keep_max_vars 80
  3197. 3197 set %barna_echo_q_max 160
  3198. 3198
  3199. 3199 ; Reasegura timers principales del addon.
  3200. 3200 barna.init
  3201. 3201
  3202. 3202 echo -s [ASN] POSTUPDATE fin: ejecuta /barna.qstatus y /barna.stats para revisar estado.
  3203. 3203}
  3204. 3204
  3205. 3205alias barna.lagflush {
  3206. 3206 echo -s [ASN] LAGFLUSH inicio: limpieza anti-lag fuerte SIN tocar canales/ASN.
  3207. 3207 barna.treset
  3208. 3208
  3209. 3209 .unset %barna_echo_asn_seen.*
  3210. 3210 .unset %barna_echo_seen.*
  3211. 3211 .unset %barna_seen_rescue_recent.*
  3212. 3212 .unset %barna_seen_rescue_pos
  3213. 3213 .unset %barna_seen_rescue_last
  3214. 3214 .unset %barna_seen_rescue_busy
  3215. 3215 .unset %barna_autonickscan_recent.*
  3216. 3216 .unset %barna_autonickscan_cpos
  3217. 3217 .unset %barna_autonickscan_npos
  3218. 3218 .unset %barna_autonickscan_last
  3219. 3219 .unset %barna_autonickscan_busy
  3220. 3220 .unset %barna_seen_display.*
  3221. 3221 .unset %barna_seen.*
  3222. 3222 .unset %barna_ip_keep.*
  3223. 3223 .unset %barna_lookup.*
  3224. 3224 .unset %barna_lookup_chans.*
  3225. 3225 .unset %barna_lookup_timer.*
  3226. 3226 .unset %barna_qry.*
  3227. 3227 .unset %barna_ipdone.*
  3228. 3228 .unset %barna_last_ip.*
  3229. 3229 .unset %barna_whoip_*
  3230. 3230 ; Build 95: purga de familias temporales antiguas que no deben sobrevivir al flush.
  3231. 3231 .unset %barna_userip_watch_*
  3232. 3232 .unset %barna_userip_watch_q_*
  3233. 3233 .unset %barna_whoip_fifo*
  3234. 3234 .unset %barna_whoip_token*
  3235. 3235 .unset %barna_whoip_sent.*
  3236. 3236 .unset %barna_whoip_315_*
  3237. 3237 .unset %barna_tmp_*
  3238. 3238 .unset %barna_hygiene_*
  3239. 3239 .unset %barna_abort.*
  3240. 3240 .unset %barna_privileged.*
  3241. 3241 .unset %barna_hunted.*
  3242. 3242 .unset %barna_badpfx2.*
  3243. 3243 .unset %barna_badpfx3.*
  3244. 3244 .unset %barna_badnick.*
  3245. 3245 .unset %barna_badnick_ip.*
  3246. 3246 .unset %barna_badnick_chans.*
  3247. 3247 .unset %barna_userip_inflight.*
  3248. 3248 .unset %barna_userip_inflight_count
  3249. 3249 .unset %barna_userip_q_scheduled
  3250. 3250 .unset %barna_userip_q_active
  3251. 3251 .unset %barna_userip_q_running
  3252. 3252 .unset %barna_jguard_items
  3253. 3253 .unset %barna_jguard.*
  3254. 3254 .unset %barna_jguard_ts.*
  3255. 3255 .unset %barna_jguard_nick.*
  3256. 3256
  3257. 3257 .unset %barna_userip_q_pending.*
  3258. 3258 .unset %barna_userip_q_nick.*
  3259. 3259 .unset %barna_userip_q_slot.*
  3260. 3260 .unset %barna_userip_q_chans.*
  3261. 3261 .unset %barna_userip_q_item.*
  3262. 3262 .unset %barna_userip_q_head
  3263. 3263 .unset %barna_userip_q_tail
  3264. 3264 .unset %barna_userip_q_count_real
  3265. 3265 .unset %barna_echo_q_*
  3266. 3266
  3267. 3267 ; Build 98: purga extra de estado socket/ASN/WHOIP que puede crecer aunque no haya sockets reales.
  3268. 3268 .unset %barna_sock.*
  3269. 3269 .unset %barna_sock_name.*
  3270. 3270 .unset %barna_sock_nick.*
  3271. 3271 .unset %barna_sock_ip.*
  3272. 3272 .unset %barna_sock_id.*
  3273. 3273 .unset %barna_sock_expected.*
  3274. 3274 .unset %barna_sock_opened.*
  3275. 3275 .unset %barna_sock_timeout_seen.*
  3276. 3276 .unset %barna_rx.*
  3277. 3277 .unset %barna_asn_done.*
  3278. 3278 .unset %barna_q_finished.*
  3279. 3279 .unset %temp_ip_*
  3280. 3280 .unset %asn_val.*
  3281. 3281 .unset %as_name_val.*
  3282. 3282 .unset %barna_userip_sent_recent.*
  3283. 3283 .unset %barna_userip_sent_ts.*
  3284. 3284 .unset %barna_userip_retry.*
  3285. 3285 .unset %barna_userip_watchtry.*
  3286. 3286 .unset %barna_userip_current_*
  3287. 3287 .unset %barna_whoip_current_*
  3288. 3288
  3289. 3289 .unset %barna_joinfix_q_*
  3290. 3290 .unset %barna_joinfix_*
  3291. 3291 .unset %barna_joinfix*
  3292. 3292
  3293. 3293 set %barna_userip_q_batch_max 2
  3294. 3294 set %barna_userip_turbo_threshold 10
  3295. 3295 set %barna_userip_turbo_batch_max 3
  3296. 3296 set %barna_userip_emergency_threshold 30
  3297. 3297 set %barna_userip_emergency_batch_max 3
  3298. 3298 set %barna_userip_q_max_pending 400
  3299. 3299 set %barna_userip_q_shed_to 0
  3300. 3300 set %barna_userip_no_shed 1
  3301. 3301 set %barna_userip_state_ttl 60
  3302. 3302 set %barna_userip_drop_count 0
  3303. 3303 set %barna_userip_stuck_rescue 1
  3304. 3304 set %barna_autonickscan 0
  3305. 3305 set %barna_join_guard 0
  3306. 3306 set %barna_seen_rescue 0
  3307. 3307 set %barna_core_minimal 1
  3308. 3308 set %barna_whoip_lightvars 1
  3309. 3309 set %barna_echo_dedupe_secs 90
  3310. 3310 set %barna_total_max_vars 900
  3311. 3311 set %barna_seen_max_vars 0
  3312. 3312 set %barna_echo_seen_max_vars 40
  3313. 3313 set %barna_echo_asn_seen_max_vars 120
  3314. 3314 set %barna_ip_keep_max_vars 80
  3315. 3315 set %barna_echo_q_max 160
  3316. 3316
  3317. 3317 barna.sockvarclean
  3318. 3318 barna.saquitfix
  3319. 3319 barna.init
  3320. 3320 echo -s [ASN] LAGFLUSH fin: temporales purgados. Ejecuta /barna.qstatus y /barna.stats.
  3321. 3321}
  3322. 3322
  3323. 3323alias barna.reload {
  3324. 3324 barna.postupdate
  3325. 3325}
  3326. 3326
  3327. 3327alias barna.pfxreset {
  3328. 3328 unset %barna_badpfx2.*
  3329. 3329 unset %barna_badpfx3.*
  3330. 3330 echo -s [ASN] Cache de prefijos ASN malos reiniciada.
  3331. 3331}
  3332. 3332
  3333. 3333
  3334. 3334alias barna.fullreset {
  3335. 3335 var %i = 1
  3336. 3336 var %c = 0
  3337. 3337
  3338. 3338 unset %__barna_keep_*
  3339. 3339
  3340. 3340 while (%i <= $var(%barna_chan.*,0)) {
  3341. 3341 inc %c
  3342. 3342 set %__barna_keep_name. $+ %c $var(%barna_chan.*,%i)
  3343. 3343 set %__barna_keep_value. $+ %c $var(%barna_chan.*,%i).value
  3344. 3344 inc %i
  3345. 3345 }
  3346. 3346
  3347. 3347 var %i = 1
  3348. 3348 while (%i <= $var(%barna_asn.*,0)) {
  3349. 3349 inc %c
  3350. 3350 set %__barna_keep_name. $+ %c $var(%barna_asn.*,%i)
  3351. 3351 set %__barna_keep_value. $+ %c $var(%barna_asn.*,%i).value
  3352. 3352 inc %i
  3353. 3353 }
  3354. 3354
  3355. 3355 set %__barna_keep_count %c
  3356. 3356
  3357. 3357 set %barna_addon 0
  3358. 3358 barna.treset
  3359. 3359
  3360. 3360 var %s = $sock(0)
  3361. 3361 while (%s) {
  3362. 3362 var %sn = $sock(%s)
  3363. 3363 if (ipinfo* iswm %sn) sockclose %sn
  3364. 3364 if (asnmanual_* iswm %sn) sockclose %sn
  3365. 3365 dec %s
  3366. 3366 }
  3367. 3367
  3368. 3368 ; Build 33: PROTECCION CRITICA.
  3369. 3369 ; Nunca borrar %barna_chan.* ni %barna_asn.* dentro de fullreset.
  3370. 3370 ; Antes se usaba "unset %barna_*" y se restauraba despues, pero si algo fallaba
  3371. 3371 ; se podian perder canales activos o ASN por canal. Desde este build se limpian
  3372. 3372 ; solo grupos temporales/cache/colas, dejando la configuracion viva intacta.
  3373. 3373 barna.qreset
  3374. 3374 barna.cachereset silent
  3375. 3375 unset %barna_badpfx2.*
  3376. 3376 unset %barna_badpfx3.*
  3377. 3377 unset %temp_ip_*
  3378. 3378 unset %asn_val.*
  3379. 3379 unset %as_name_val.*
  3380. 3380
  3381. 3381 var %i = 1
  3382. 3382 while (%i <= %__barna_keep_count) {
  3383. 3383 var %n = [ [ $+(%,__barna_keep_name.,%i) ] ]
  3384. 3384 var %v = [ [ $+(%,__barna_keep_value.,%i) ] ]
  3385. 3385 if (%n != $null) set %n %v
  3386. 3386 inc %i
  3387. 3387 }
  3388. 3388
  3389. 3389 unset %__barna_keep_*
  3390. 3390
  3391. 3391 _barna_runtime_defaults
  3392. 3392 set %barna_addon 1
  3393. 3393
  3394. 3394 echo -s [ASN] Reset limpio completo: conservados canales activos y ASN por canal. Se han borrado colas, cache exacta, prefijos malos, vistos y SAQUIT pendientes.
  3395. 3395}
  3396. 3396
  3397. 3397alias barna.cleanstart {
  3398. 3398 barna.fullreset
  3399. 3399}
  3400. 3400
  3401. 3401alias barna.cachereset {
  3402. 3402 var %modo = $1
  3403. 3403 var %a = $var(%barna_asn_cache_asn.*,0)
  3404. 3404 var %n = $var(%barna_asn_cache_name.*,0)
  3405. 3405 var %t = $var(%barna_asn_cache_ts.*,0)
  3406. 3406
  3407. 3407 unset %barna_asn_cache_asn.*
  3408. 3408 unset %barna_asn_cache_name.*
  3409. 3409 unset %barna_asn_cache_ts.*
  3410. 3410 unset %barna_ipasn_cache.*
  3411. 3411 unset %barna_ip_cache.*
  3412. 3412 unset %barna_cache_asn.*
  3413. 3413 unset %barna_cache_name.*
  3414. 3414
  3415. 3415 if (%modo != silent) {
  3416. 3416 echo -s [ASN] Cache ASN por IP exacta reiniciada: asn= %a name= %n ts= %t $+ . No se han borrado prefijos malos.
  3417. 3417 }
  3418. 3418}
  3419. 3419
  3420. 3420alias barna.cacheclean {
  3421. 3421 barna.cachereset
  3422. 3422}
  3423. 3423
  3424. 3424
  3425. 3425; ------------------------------------------------------------
  3426. 3426; BLOQUE 7.4.1
  3427. 3427; BUILD 120 - CACHECAP MARKGC ASN/ISP/TS
  3428. 3428; ------------------------------------------------------------
  3429. 3429; Objetivo: impedir que %barna_asn_cache_asn/name/ts crezca a cientos
  3430. 3430; o miles de variables sin borrar toda la cache de golpe.
  3431. 3431;
  3432. 3432; Build 117: hard purge podia congelar mIRC.
  3433. 3433; Build 118: unset dinamico empezaba a localizar claves, pero no ganaba carrera.
  3434. 3434; Build 120: bloqueo de cache nueva + batch adaptativo; funcionaba, pero el
  3435. 3435; drenaje golpeaba repetidamente la misma clave y el contador bajaba
  3436. 3436; mucho menos que el batch reportado.
  3437. 3437; Build 120: MARKGC: marca claves distintas para expirar con set -u1 y escanea
  3438. 3438; hacia atras por indice. Asi cada lote afecta a IPs diferentes y
  3439. 3439; evita quedarse clavado en el mismo lastkey. No toca %barna_chan.*
  3440. 3440; ni %barna_asn.*.
  3441. 3441; Build 121: TOTALPRESSURE_GC: si total_vars sigue por encima de totalmax,
  3442. 3442; MARKGC continua de hard hacia target y ejecuta GC auxiliar seguro
  3443. 3443; de sock/saquit/echo sin tocar canales ni ASN configurados.
  3444. 3444; Build 124: AUXPRESSURE_GC: cuando cache ya esta en target pero total_vars
  3445. 3445; sigue por encima de totalmax, mantiene drain activo y baja auxiliares
  3446. 3446; seguros por lotes pequenos: echo_seen/dedupe, badnick temporal, sock
  3447. 3447; fantasma y SAQUIT solo si no hay timers activos. No toca canales/ASN.
  3448. 3448; Build 126: AUXPRESSURE_GC3: ajuste fino tras horas: limpia auxiliares
  3449. 3449; residuales con total_pressure sostenido. Procesa JOIN_DELAY maduro,
  3450. 3450; baja echo_* y badnick con unset inmediato, compacta q_* fantasma y
  3451. 3451; recorta SAQUIT sin timer activo. No toca canales/ASN ni sanciones vivas.
  3452. 3452; Build 129: SAFE_GC_AUXDISTINCT: reduce agresividad para evitar cierres de mIRC: menos
  3453. 3453; barridos por tick, intervalos de drain mas largos y expiracion diferida
  3454. 3454; con set -u2 en auxiliares. Mantiene filtros __gc__ y cache controlada.
  3455. 3455; Build 133: CRASHSAFE_FAIRPRESSURE_CAPACITY: CoreTick sigue minimo y BarnaMaintenance prioriza una sola familia util bajo presion
  3456. 3456; juntos cada 2s. BarnaMaintenance reparte una sola tarea cada 5s, sin timer
  3457. 3457; de drain autorreprogramado. Cache MARKGC se mantiene segura y separada.
  3458. 3458
  3459. 3459alias _barna_cachecap117_defaults {
  3460. 3460 if (%barna_cachecap117_enabled == $null) set %barna_cachecap117_enabled 1
  3461. 3461
  3462. 3462 if (%barna_asn_cache_max_exact == $null) set %barna_asn_cache_max_exact 120
  3463. 3463 if (%barna_asn_cache_max_exact < 80) set %barna_asn_cache_max_exact 120
  3464. 3464 if (%barna_asn_cache_max_exact > 180) set %barna_asn_cache_max_exact 120
  3465. 3465
  3466. 3466 if (%barna_asn_cache_hard_limit == $null) set %barna_asn_cache_hard_limit 180
  3467. 3467 if (%barna_asn_cache_hard_limit < %barna_asn_cache_max_exact) set %barna_asn_cache_hard_limit $calc(%barna_asn_cache_max_exact + 60)
  3468. 3468 if (%barna_asn_cache_hard_limit > 260) set %barna_asn_cache_hard_limit 180
  3469. 3469
  3470. 3470 ; Build 120: forzamos valores sanos aunque queden variables heredadas.
  3471. 3471 if (%barna_cachecap117_interval == $null) set %barna_cachecap117_interval 5
  3472. 3472 if (%barna_cachecap117_interval != 5) set %barna_cachecap117_interval 5
  3473. 3473
  3474. 3474 if (%barna_cachecap117_batch == $null) set %barna_cachecap117_batch 16
  3475. 3475 if (%barna_cachecap117_batch < 8) set %barna_cachecap117_batch 16
  3476. 3476 if (%barna_cachecap117_batch > 32) set %barna_cachecap117_batch 16
  3477. 3477
  3478. 3478 if (%barna_cachecap117_echo_batch == $null) set %barna_cachecap117_echo_batch 6
  3479. 3479 if (%barna_cachecap117_echo_batch < 3) set %barna_cachecap117_echo_batch 6
  3480. 3480 if (%barna_cachecap117_echo_batch > 12) set %barna_cachecap117_echo_batch 6
  3481. 3481}
  3482. 3482
  3483. 3483alias _barna_cachecap117_effective_batch {
  3484. 3484 _barna_cachecap117_defaults
  3485. 3485 var %cache = $1
  3486. 3486 if (%cache !isnum 0-) var %cache = $var(%barna_asn_cache_asn.*,0)
  3487. 3487
  3488. 3488 ; Build 133: bajo presion total la cache entre 130-180 tambien necesita
  3489. 3489 ; capacidad suficiente. Sigue siendo MARKGC diferido y cache-only.
  3490. 3490 if ($_barna_cachecap121_total_pressure == 1) {
  3491. 3491 if (%cache > 150) return 24
  3492. 3492 if (%cache > 130) return 20
  3493. 3493 }
  3494. 3494
  3495. 3495 ; Recuperacion segura de caches heredadas grandes.
  3496. 3496 if (%cache > 3000) return 60
  3497. 3497 if (%cache > 1800) return 54
  3498. 3498 if (%cache > 1000) return 48
  3499. 3499 if (%cache > 500) return 45
  3500. 3500 if (%cache > 260) return 36
  3501. 3501 if (%cache > 180) return 30
  3502. 3502 return %barna_cachecap117_batch
  3503. 3503}
  3504. 3504
  3505. 3505alias _barna_cachecap120_key_from_asnvar {
  3506. 3506 if ($1 == $null) return
  3507. 3507 var %asnvar = $1
  3508. 3508 var %prefix = $+(%,barna_asn_cache_asn.)
  3509. 3509 var %key = $remove(%asnvar,%prefix)
  3510. 3510 if (%key == $null) return
  3511. 3511 if (%key == %asnvar) return
  3512. 3512 return %key
  3513. 3513}
  3514. 3514
  3515. 3515alias _barna_asn_cache_expire_key120 {
  3516. 3516 if ($1 == $null) return 0
  3517. 3517 var %key = $1
  3518. 3518
  3519. 3519 ; Evita marcar la misma IP una y otra vez dentro de la ventana de expiracion.
  3520. 3520 if ($var($+(%,barna_cachecap120_marked.,%key),0) > 0) return 0
  3521. 3521
  3522. 3522 set -u8 $+(%,barna_cachecap120_marked.,%key) 1
  3523. 3523
  3524. 3524 ; En vez de unset dinamico inmediato, marcamos expiracion a 1s.
  3525. 3525 ; Esto es mas fiable en mIRC y evita barridos masivos bloqueantes.
  3526. 3526 set -u1 $+(%,barna_asn_cache_asn.,%key) __gc__
  3527. 3527 set -u1 $+(%,barna_asn_cache_name.,%key) __gc__
  3528. 3528 set -u1 $+(%,barna_asn_cache_ts.,%key) 0
  3529. 3529
  3530. 3530 set -u60 %barna_cachecap117_last_key %key
  3531. 3531 return 1
  3532. 3532}
  3533. 3533
  3534. 3534alias _barna_cachecap117_delete_batch_asn {
  3535. 3535 var %limit = $1
  3536. 3536 if (%limit !isnum 1-) var %limit = 24
  3537. 3537
  3538. 3538 var %n = $var(%barna_asn_cache_asn.*,0)
  3539. 3539 if (%n <= 0) return 0
  3540. 3540
  3541. 3541 var %i = %n
  3542. 3542 var %done = 0
  3543. 3543 var %guard = 0
  3544. 3544 var %maxscan = $calc((%limit * 8) + 80)
  3545. 3545
  3546. 3546 while ((%i >= 1) && (%done < %limit) && (%guard < %maxscan)) {
  3547. 3547 var %asnvar = $var(%barna_asn_cache_asn.*,%i)
  3548. 3548 var %key = $_barna_cachecap120_key_from_asnvar(%asnvar)
  3549. 3549 if (%key != $null) {
  3550. 3550 if ($_barna_asn_cache_expire_key120(%key)) inc %done
  3551. 3551 }
  3552. 3552 dec %i
  3553. 3553 inc %guard
  3554. 3554 }
  3555. 3555
  3556. 3556 return %done
  3557. 3557}
  3558. 3558
  3559. 3559; Compatibilidad: alias antiguo, ahora usa MARKGC por lotes de 1 clave.
  3560. 3560alias _barna_cachecap117_delete_last_asn {
  3561. 3561 return $_barna_cachecap117_delete_batch_asn(1)
  3562. 3562}
  3563. 3563
  3564. 3564alias _barna_cachecap117_delete_last_echo_asn {
  3565. 3565 var %n = $var(%barna_echo_asn_seen.*,0)
  3566. 3566 if (%n <= 0) return 0
  3567. 3567 var %v = $var(%barna_echo_asn_seen.*,%n)
  3568. 3568 if (%v == $null) return 0
  3569. 3569 set -u1 %v 0
  3570. 3570 return 1
  3571. 3571}
  3572. 3572
  3573. 3573alias _barna_cachecap117_delete_last_echo_q {
  3574. 3574 var %n = $var(%barna_echo_q_seen.*,0)
  3575. 3575 if (%n <= 0) return 0
  3576. 3576 var %v = $var(%barna_echo_q_seen.*,%n)
  3577. 3577 if (%v == $null) return 0
  3578. 3578 set -u1 %v 0
  3579. 3579 return 1
  3580. 3580}
  3581. 3581
  3582. 3582alias _barna_cachecap117_start_drain {
  3583. 3583 ; Build 132: no crea ni rearma un timer rapido independiente.
  3584. 3584 ; Solo solicita drenaje; BarnaMaintenance lo ejecuta sin solapamientos.
  3585. 3585 _barna_cachecap117_defaults
  3586. 3586 if (%barna_cachecap117_enabled != 1) return 0
  3587. 3587 set -u30 %barna_cachecap117_drain_requested 1
  3588. 3588 if ($timer(BarnaMaintenance) == $null) .timerBarnaMaintenance 0 5 _barna_maintenance_tick
  3589. 3589 return 1
  3590. 3590}
  3591. 3591
  3592. 3592
  3593. 3593alias _barna_cachecap121_total_pressure {
  3594. 3594 var %total = $var(%barna_*,0)
  3595. 3595 var %max = %barna_total_max_vars
  3596. 3596 if (%max !isnum 200-) var %max = 900
  3597. 3597 if (%total > %max) return 1
  3598. 3598 return 0
  3599. 3599}
  3600. 3600
  3601. 3601alias _barna_cachecap121_should_drain {
  3602. 3602 _barna_cachecap117_defaults
  3603. 3603 var %cache = $var(%barna_asn_cache_asn.*,0)
  3604. 3604 var %target = %barna_asn_cache_max_exact
  3605. 3605 var %hard = %barna_asn_cache_hard_limit
  3606. 3606 if (%target !isnum 50-) var %target = 120
  3607. 3607 if (%hard !isnum 80-) var %hard = 180
  3608. 3608
  3609. 3609 ; Normal: si supera hard, drenar.
  3610. 3610 if (%cache > %hard) return 1
  3611. 3611
  3612. 3612 ; Build 121: si el total global aun supera limite, seguir bajando cache hasta target.
  3613. 3613 if (($_barna_cachecap121_total_pressure) && (%cache > %target)) return 1
  3614. 3614
  3615. 3615 return 0
  3616. 3616}
  3617. 3617
  3618. 3618
  3619. 3619alias _barna_cachecap124_key_from_prefix_var {
  3620. 3620 if ($1 == $null) return
  3621. 3621 if ($2 == $null) return
  3622. 3622 var %v = $1
  3623. 3623 var %prefix = $2
  3624. 3624 var %key = $remove(%v,%prefix)
  3625. 3625 if (%key == $null) return
  3626. 3626 if (%key == %v) return
  3627. 3627 return %key
  3628. 3628}
  3629. 3629
  3630. 3630alias _barna_cachecap124_expire_varname {
  3631. 3631 if ($1 == $null) return 0
  3632. 3632 var %v = $1
  3633. 3633 set -u1 %v 0
  3634. 3634 return 1
  3635. 3635}
  3636. 3636
  3637. 3637alias _barna_cachecap124_delete_last_badnick {
  3638. 3638 var %n = $var(%barna_badnick.*,0)
  3639. 3639 if (%n <= 0) return 0
  3640. 3640 var %v = $var(%barna_badnick.*,%n)
  3641. 3641 var %ln = $_barna_cachecap124_key_from_prefix_var(%v,$+(%,barna_badnick.))
  3642. 3642 if (%ln == $null) return 0
  3643. 3643 set -u1 $+(%,barna_badnick.,%ln) 0
  3644. 3644 set -u1 $+(%,barna_badnick_ip.,%ln) 0
  3645. 3645 set -u1 $+(%,barna_badnick_chans.,%ln) 0
  3646. 3646 return 1
  3647. 3647}
  3648. 3648
  3649. 3649alias _barna_cachecap124_delete_last_echo_seen {
  3650. 3650 var %n = $var(%barna_echo_seen.*,0)
  3651. 3651 if (%n <= 0) return 0
  3652. 3652 var %v = $var(%barna_echo_seen.*,%n)
  3653. 3653 if (%v == $null) return 0
  3654. 3654 set -u1 %v 0
  3655. 3655 return 1
  3656. 3656}
  3657. 3657
  3658. 3658alias _barna_cachecap125_has_saquit_timer_for {
  3659. 3659 if ($1 == $null) return 0
  3660. 3660 var %ln = $lower($1)
  3661. 3661 var %i = $timer(0)
  3662. 3662
  3663. 3663 while (%i > 0) {
  3664. 3664 var %t = $lower($timer(%i))
  3665. 3665 if (%ln isin %t) {
  3666. 3666 if (barnasaquit_* iswm %t) return 1
  3667. 3667 if (barnacheck_* iswm %t) return 1
  3668. 3668 if (barnafinal_* iswm %t) return 1
  3669. 3669 }
  3670. 3670 dec %i
  3671. 3671 }
  3672. 3672
  3673. 3673 return 0
  3674. 3674}
  3675. 3675
  3676. 3676alias _barna_cachecap125_has_any_saquit_timer {
  3677. 3677 var %i = $timer(0)
  3678. 3678
  3679. 3679 while (%i > 0) {
  3680. 3680 var %t = $lower($timer(%i))
  3681. 3681 if (barnasaquit_* iswm %t) return 1
  3682. 3682 if (barnacheck_* iswm %t) return 1
  3683. 3683 if (barnafinal_* iswm %t) return 1
  3684. 3684 dec %i
  3685. 3685 }
  3686. 3686
  3687. 3687 return 0
  3688. 3688}
  3689. 3689
  3690. 3690alias _barna_cachecap125_delete_last_saquit_safe {
  3691. 3691 ; Borra un grupo SAQUIT seguro bajo presion total.
  3692. 3692 ; Prioridad: nicks sin timer activo y que ya no estan en canales activos.
  3693. 3693 ; No toca timers activos ni sanciones vivas.
  3694. 3694 var %scan = $var(%barna_saquit_sent.*,0)
  3695. 3695 var %limit = 80
  3696. 3696 var %prefix = $+(%,barna_saquit_sent.)
  3697. 3697
  3698. 3698 while ((%scan > 0) && (%limit > 0)) {
  3699. 3699 var %v = $var(%barna_saquit_sent.*,%scan)
  3700. 3700 var %ln = $_barna_cachecap124_key_from_prefix_var(%v,%prefix)
  3701. 3701
  3702. 3702 if (%ln != $null) {
  3703. 3703 if (!$_barna_cachecap125_has_saquit_timer_for(%ln)) {
  3704. 3704 if ($_barna_nick_enabled_chans(%ln) == $null) {
  3705. 3705 set -u2 $+(%,barna_saquit_sent.,%ln) 0
  3706. 3706 set -u2 $+(%,barna_saquit_ip.,%ln) 0
  3707. 3707 set -u2 $+(%,barna_saquit_chans.,%ln) 0
  3708. 3708 set -u2 $+(%,barna_saquit_msg.,%ln) 0
  3709. 3709 set -u2 $+(%,barna_saquit_showchans.,%ln) 0
  3710. 3710 set -u2 $+(%,barna_saquit_pending.,%ln) 0
  3711. 3711 set -u2 $+(%,barna_saquit_timer.,%ln) 0
  3712. 3712 set -u2 $+(%,barna_saquit_q_slot.,%ln) 0
  3713. 3713 return 1
  3714. 3714 }
  3715. 3715 }
  3716. 3716 }
  3717. 3717
  3718. 3718 dec %scan
  3719. 3719 dec %limit
  3720. 3720 }
  3721. 3721
  3722. 3722 ; Fallback seguro: si no hay ningun timer SAQUIT/Check/Final ni cola real, dejar actuar al GC idle completo.
  3723. 3723 if (($_barna_saquit_q_count <= 0) && (!$_barna_cachecap125_has_any_saquit_timer)) {
  3724. 3724 if ($_barna_saquit_gc_idle) return 1
  3725. 3725 }
  3726. 3726
  3727. 3727 ; Fallback prudente bajo presion: elimina solo marcadores sent antiguos, no ip/chans/msg activos.
  3728. 3728 var %scan2 = $var(%barna_saquit_sent.*,0)
  3729. 3729 if (%scan2 > 40) {
  3730. 3730 var %v2 = $var(%barna_saquit_sent.*,%scan2)
  3731. 3731 var %ln2 = $_barna_cachecap124_key_from_prefix_var(%v2,%prefix)
  3732. 3732 if ((%ln2 != $null) && (!$_barna_cachecap125_has_saquit_timer_for(%ln2))) {
  3733. 3733 set -u2 $+(%,barna_saquit_sent.,%ln2) 0
  3734. 3734 return 1
  3735. 3735 }
  3736. 3736 }
  3737. 3737
  3738. 3738 return 0
  3739. 3739}
  3740. 3740
  3741. 3741alias _barna_cachecap125_trim_saquit_safe {
  3742. 3742 var %before = $var(%barna_saquit*,0)
  3743. 3743 if (%before <= 60) return 0
  3744. 3744
  3745. 3745 var %todo = $calc(%before - 60)
  3746. 3746 if (%todo > 28) var %todo = 28
  3747. 3747 var %done = 0
  3748. 3748
  3749. 3749 while (%todo > 0) {
  3750. 3750 if (!$_barna_cachecap125_delete_last_saquit_safe) break
  3751. 3751 inc %done
  3752. 3752 dec %todo
  3753. 3753 }
  3754. 3754
  3755. 3755 return %done
  3756. 3756}
  3757. 3757
  3758. 3758alias _barna_cachecap125_trim_echo_queue_safe {
  3759. 3759 ; Si no hay cola real de echo (head/tail vacios), elimina dedupe/estado sobrante.
  3760. 3760 ; Si hay cola, solo deja que _barna_echo_q_process avance.
  3761. 3761 var %done = 0
  3762. 3762 if ((%barna_echo_q_head != $null) && (%barna_echo_q_tail != $null)) {
  3763. 3763 noop $_barna_echo_q_process
  3764. 3764 return 0
  3765. 3765 }
  3766. 3766
  3767. 3767 var %n = $var(%barna_echo_q_*,0)
  3768. 3768 while ((%n > 0) && (%done < 12)) {
  3769. 3769 var %v = $var(%barna_echo_q_*,%n)
  3770. 3770 if (%v != $null) {
  3771. 3771 set -u1 %v 0
  3772. 3772 inc %done
  3773. 3773 }
  3774. 3774 dec %n
  3775. 3775 }
  3776. 3776
  3777. 3777 return %done
  3778. 3778}
  3779. 3779
  3780. 3780
  3781. 3781alias _barna_cachecap127_unset_varname {
  3782. 3782 ; Build 129 SAFE_GC_AUXDISTINCT: expiracion diferida; nunca usa unset masivo.
  3783. 3783 if ($1 == $null) return 0
  3784. 3784 var %v = $1
  3785. 3785 set -u2 %v 0
  3786. 3786 return 1
  3787. 3787}
  3788. 3788
  3789. 3789alias _barna_cachecap127_delete_last_echo_asn_now {
  3790. 3790 ; Buscar hacia atras una entrada aun no marcada. Evita seleccionar 12 veces
  3791. 3791 ; la misma variable durante un lote mientras espera su expiracion -u2.
  3792. 3792 var %n = $var(%barna_echo_asn_seen.*,0)
  3793. 3793 while (%n > 0) {
  3794. 3794 var %v = $var(%barna_echo_asn_seen.*,%n)
  3795. 3795 if (%v != $null) {
  3796. 3796 var %val = [ [ %v ] ]
  3797. 3797 if ((%val != 0) && (%val != __gc__)) return $_barna_cachecap127_unset_varname(%v)
  3798. 3798 }
  3799. 3799 dec %n
  3800. 3800 }
  3801. 3801 return 0
  3802. 3802}
  3803. 3803
  3804. 3804alias _barna_cachecap127_delete_last_echo_q_now {
  3805. 3805 var %n = $var(%barna_echo_q_seen.*,0)
  3806. 3806 while (%n > 0) {
  3807. 3807 var %v = $var(%barna_echo_q_seen.*,%n)
  3808. 3808 if (%v != $null) {
  3809. 3809 var %val = [ [ %v ] ]
  3810. 3810 if ((%val != 0) && (%val != __gc__)) return $_barna_cachecap127_unset_varname(%v)
  3811. 3811 }
  3812. 3812 dec %n
  3813. 3813 }
  3814. 3814 return 0
  3815. 3815}
  3816. 3816
  3817. 3817alias _barna_cachecap127_delete_last_echo_seen_now {
  3818. 3818 var %n = $var(%barna_echo_seen.*,0)
  3819. 3819 while (%n > 0) {
  3820. 3820 var %v = $var(%barna_echo_seen.*,%n)
  3821. 3821 if (%v != $null) {
  3822. 3822 var %val = [ [ %v ] ]
  3823. 3823 if ((%val != 0) && (%val != __gc__)) return $_barna_cachecap127_unset_varname(%v)
  3824. 3824 }
  3825. 3825 dec %n
  3826. 3826 }
  3827. 3827 return 0
  3828. 3828}
  3829. 3829
  3830. 3830alias _barna_cachecap127_delete_last_badnick_now {
  3831. 3831 ; Selecciona un nick distinto aun no marcado. La entrada principal a 0 indica
  3832. 3832 ; que ese grupo ya espera expiracion y debe saltarse en este lote.
  3833. 3833 var %n = $var(%barna_badnick.*,0)
  3834. 3834 while (%n > 0) {
  3835. 3835 var %v = $var(%barna_badnick.*,%n)
  3836. 3836 var %ln = $_barna_cachecap124_key_from_prefix_var(%v,$+(%,barna_badnick.))
  3837. 3837 if ((%v != $null) && (%ln != $null)) {
  3838. 3838 var %val = [ [ %v ] ]
  3839. 3839 if ((%val != 0) && (%val != __gc__)) {
  3840. 3840 set -u2 $+(%,barna_badnick.,%ln) 0
  3841. 3841 set -u2 $+(%,barna_badnick_ip.,%ln) 0
  3842. 3842 set -u2 $+(%,barna_badnick_chans.,%ln) 0
  3843. 3843 return 1
  3844. 3844 }
  3845. 3845 }
  3846. 3846 dec %n
  3847. 3847 }
  3848. 3848 return 0
  3849. 3849}
  3850. 3850
  3851. 3851alias _barna_cachecap127_delete_last_saquit_notimer {
  3852. 3852 ; Igual que AUXDISTINCT: saltar grupos sent ya marcados a 0 para no renovar
  3853. 3853 ; indefinidamente su -u2 ni contar varias veces el mismo grupo.
  3854. 3854 var %scan = $var(%barna_saquit_sent.*,0)
  3855. 3855 var %limit = 120
  3856. 3856 var %prefix = $+(%,barna_saquit_sent.)
  3857. 3857
  3858. 3858 while ((%scan > 0) && (%limit > 0)) {
  3859. 3859 var %v = $var(%barna_saquit_sent.*,%scan)
  3860. 3860 var %ln = $_barna_cachecap124_key_from_prefix_var(%v,%prefix)
  3861. 3861 var %sentval = $null
  3862. 3862 if (%v != $null) var %sentval = [ [ %v ] ]
  3863. 3863
  3864. 3864 if ((%ln != $null) && (%sentval != 0) && (%sentval != __gc__) && (!$_barna_cachecap125_has_saquit_timer_for(%ln))) {
  3865. 3865 set -u2 $+(%,barna_saquit_sent.,%ln) 0
  3866. 3866 set -u2 $+(%,barna_saquit_ip.,%ln) 0
  3867. 3867 set -u2 $+(%,barna_saquit_chans.,%ln) 0
  3868. 3868 set -u2 $+(%,barna_saquit_msg.,%ln) 0
  3869. 3869 set -u2 $+(%,barna_saquit_showchans.,%ln) 0
  3870. 3870 set -u2 $+(%,barna_saquit_pending.,%ln) 0
  3871. 3871 set -u2 $+(%,barna_saquit_timer.,%ln) 0
  3872. 3872 set -u2 $+(%,barna_saquit_q_slot.,%ln) 0
  3873. 3873 return 1
  3874. 3874 }
  3875. 3875
  3876. 3876 dec %scan
  3877. 3877 dec %limit
  3878. 3878 }
  3879. 3879
  3880. 3880 return 0
  3881. 3881}
  3882. 3882
  3883. 3883alias _barna_cachecap127_trim_saquit_safe {
  3884. 3884 var %before = $var(%barna_saquit*,0)
  3885. 3885 if (%before <= 50) return 0
  3886. 3886
  3887. 3887 ; Cola SAQUIT vacia: estos restos no son accion viva. Si hay timers activos,
  3888. 3888 ; se respetan en el recorte por nick; si no hay ninguno, el GC idle puede limpiar todo.
  3889. 3889 if (($_barna_saquit_q_count <= 0) && (!$_barna_cachecap125_has_any_saquit_timer)) {
  3890. 3890 var %b0 = $var(%barna_saquit*,0)
  3891. 3891 if ($_barna_saquit_gc_idle) {
  3892. 3892 var %a0 = $var(%barna_saquit*,0)
  3893. 3893 if (%a0 < %b0) return $calc(%b0 - %a0)
  3894. 3894 }
  3895. 3895 }
  3896. 3896
  3897. 3897 var %todo = $calc(%before - 50)
  3898. 3898 if (%todo > 8) var %todo = 8
  3899. 3899 var %done = 0
  3900. 3900
  3901. 3901 while (%todo > 0) {
  3902. 3902 if (!$_barna_cachecap127_delete_last_saquit_notimer) break
  3903. 3903 inc %done
  3904. 3904 dec %todo
  3905. 3905 }
  3906. 3906
  3907. 3907 ; Limpieza de estructura de cola si el contador real es cero.
  3908. 3908 if ($_barna_saquit_q_count <= 0) {
  3909. 3909 if ($var(%barna_saquit_q_item.*,0) > 0) { unset %barna_saquit_q_item.* | inc %done }
  3910. 3910 if ($var(%barna_saquit_q_due.*,0) > 0) { unset %barna_saquit_q_due.* | inc %done }
  3911. 3911 if ($var(%barna_saquit_q_slot.*,0) > 0) { unset %barna_saquit_q_slot.* | inc %done }
  3912. 3912 unset %barna_saquit_q_head
  3913. 3913 unset %barna_saquit_q_tail
  3914. 3914 unset %barna_saquit_q_count_real
  3915. 3915 }
  3916. 3916
  3917. 3917 return %done
  3918. 3918}
  3919. 3919
  3920. 3920alias _barna_cachecap127_trim_echo_queue_now {
  3921. 3921 var %done = 0
  3922. 3922
  3923. 3923 ; Si hay cola real, darle varias pasadas para vaciar antes de tocar variables.
  3924. 3924 if ((%barna_echo_q_head != $null) && (%barna_echo_q_tail != $null)) {
  3925. 3925 noop $_barna_echo_q_process
  3926. 3926 if ((%barna_echo_q_head != $null) && (%barna_echo_q_tail != $null)) return 0
  3927. 3927 }
  3928. 3928
  3929. 3929 ; Sin cola real: todos los %barna_echo_q_* restantes son dedupe/estado temporal.
  3930. 3930 var %n = $var(%barna_echo_q_*,0)
  3931. 3931 while ((%n > 0) && (%done < 12)) {
  3932. 3932 var %v = $var(%barna_echo_q_*,%n)
  3933. 3933 if (%v != $null) {
  3934. 3934 set -u2 %v 0
  3935. 3935 inc %done
  3936. 3936 }
  3937. 3937 dec %n
  3938. 3938 }
  3939. 3939
  3940. 3940 unset %barna_echo_q_head
  3941. 3941 unset %barna_echo_q_tail
  3942. 3942 unset %barna_echo_q_running
  3943. 3943 unset %barna_echo_q_scheduled
  3944. 3944
  3945. 3945 return %done
  3946. 3946}
  3947. 3947
  3948. 3948alias _barna_cachecap127_join_delay_pressure_gc {
  3949. 3949 if ($_barna_join_delay_count <= 12) return 0
  3950. 3950
  3951. 3951 var %oldth = %barna_join_delay_fast_threshold
  3952. 3952 var %oldbatch = %barna_join_delay_fast_batch
  3953. 3953 var %oldage = %barna_join_delay_fast_age
  3954. 3954 var %oldgc = %barna_join_delay_gc_age
  3955. 3955 var %total = $var(%barna_*,0)
  3956. 3956 var %batch = 12
  3957. 3957 if (%total > 1050) var %batch = 20
  3958. 3958 elseif (%total > 900) var %batch = 16
  3959. 3959
  3960. 3960 set %barna_join_delay_fast_threshold 12
  3961. 3961 set %barna_join_delay_fast_batch %batch
  3962. 3962 set %barna_join_delay_fast_age 1
  3963. 3963 set %barna_join_delay_gc_age 12
  3964. 3964
  3965. 3965 var %jb = $_barna_join_delay_count
  3966. 3966 noop $_barna_join_delay_pressure_tick
  3967. 3967 noop $_barna_join_delay_gc_tick
  3968. 3968 var %ja = $_barna_join_delay_count
  3969. 3969 var %done = 0
  3970. 3970 if (%ja < %jb) var %done = $calc(%jb - %ja)
  3971. 3971
  3972. 3972 if (%oldth != $null) set %barna_join_delay_fast_threshold %oldth
  3973. 3973 else unset %barna_join_delay_fast_threshold
  3974. 3974 if (%oldbatch != $null) set %barna_join_delay_fast_batch %oldbatch
  3975. 3975 else unset %barna_join_delay_fast_batch
  3976. 3976 if (%oldage != $null) set %barna_join_delay_fast_age %oldage
  3977. 3977 else unset %barna_join_delay_fast_age
  3978. 3978 if (%oldgc != $null) set %barna_join_delay_gc_age %oldgc
  3979. 3979 else unset %barna_join_delay_gc_age
  3980. 3980
  3981. 3981 return %done
  3982. 3982}
  3983. 3983
  3984. 3984alias _barna_cachecap127_q_ghost_gc {
  3985. 3985 ; Cola ASN real vacia o casi vacia: compactar restos q_* si no hay socket real.
  3986. 3986 if ($_barna_ipinfo_sock_count > 0) return 0
  3987. 3987 var %before = $var(%barna_q_*,0)
  3988. 3988 if (%before <= 40) return 0
  3989. 3989
  3990. 3990 var %live = $calc($numtok(%barna_q_items,44) + $numtok(%barna_q_low_items,44))
  3991. 3991 var %running = %barna_q_running
  3992. 3992 if (%running == $null) var %running = 0
  3993. 3993
  3994. 3994 if ((%live == 0) && (%running == 0)) {
  3995. 3995 noop $_barna_q_idle_gc
  3996. 3996 var %after0 = $var(%barna_q_*,0)
  3997. 3997 if (%after0 < %before) return $calc(%before - %after0)
  3998. 3998 }
  3999. 3999
  4000. 4000 if (%live <= 3) {
  4001. 4001 noop $_barna_q_clear_ghost_light
  4002. 4002 noop $_barna_q_compact_vars
  4003. 4003 var %after = $var(%barna_q_*,0)
  4004. 4004 if (%after < %before) return $calc(%before - %after)
  4005. 4005 }
  4006. 4006
  4007. 4007 return 0
  4008. 4008}
  4009. 4009
  4010. 4010alias _barna_cachecap127_lookup_tail_gc {
  4011. 4011 ; Si hay muy poco trabajo real y no hay sockets, recorta restos lookup/ipdone/last_ip antiguos.
  4012. 4012 if ($_barna_ipinfo_sock_count > 0) return 0
  4013. 4013 if ($_barna_userip_q_count > 5) return 0
  4014. 4014 if ($var(%barna_lookup.*,0) <= 5) return 0
  4015. 4015
  4016. 4016 var %before = $calc($var(%barna_lookup.*,0) + $var(%barna_lookup_chans.*,0) + $var(%barna_qry.*,0) + $var(%barna_ipdone.*,0) + $var(%barna_last_ip.*,0) + $var(%barna_ip_keep.*,0))
  4017. 4017 if (%before <= 12) return 0
  4018. 4018
  4019. 4019 ; No se toca una consulta viva si hay q_item/inflight; solo restos por encima de 3.
  4020. 4020 var %done = 0
  4021. 4021 while (($var(%barna_lookup.*,0) > 5) && (%done < 4)) {
  4022. 4022 var %v = $var(%barna_lookup.*,$var(%barna_lookup.*,0))
  4023. 4023 var %ln = $_barna_cachecap124_key_from_prefix_var(%v,$+(%,barna_lookup.))
  4024. 4024 if (%ln == $null) break
  4025. 4025 set -u2 $+(%,barna_lookup.,%ln) 0
  4026. 4026 set -u2 $+(%,barna_lookup_chans.,%ln) 0
  4027. 4027 set -u2 $+(%,barna_qry.,%ln) 0
  4028. 4028 set -u2 $+(%,barna_ipdone.,%ln) 0
  4029. 4029 set -u2 $+(%,barna_last_ip.,%ln) 0
  4030. 4030 set -u2 $+(%,barna_ip_keep.,%ln) 0
  4031. 4031 inc %done
  4032. 4032 }
  4033. 4033
  4034. 4034 return %done
  4035. 4035}
  4036. 4036
  4037. 4037alias _barna_cachecap121_aux_gc {
  4038. 4038 ; Build 129: SAFE_GC_AUXDISTINCT prudente + cache recovery seguro bajo presion total. No toca canales/ASN ni sanciones vivas.
  4039. 4039 if (!$_barna_cachecap121_total_pressure) return 0
  4040. 4040
  4041. 4041 var %changed = 0
  4042. 4042
  4043. 4043 ; Si no hay sockets reales, purga restos sock/rx/done incluso con umbral muy bajo.
  4044. 4044 if (($_barna_ipinfo_sock_count == 0) && ($_barna_sockvar_count > 0)) {
  4045. 4045 var %b = $_barna_sockvar_count
  4046. 4046 noop $_barna_sockvar_gc
  4047. 4047 var %a = $_barna_sockvar_count
  4048. 4048 if (%a < %b) inc %changed $calc(%b - %a)
  4049. 4049 }
  4050. 4050
  4051. 4051 ; Compacta restos de cola ASN cuando no hay sockets reales y hay pocos q_items vivos.
  4052. 4052 if ($var(%barna_q_*,0) > 40) {
  4053. 4053 var %qg = $_barna_cachecap127_q_ghost_gc
  4054. 4054 if (%qg isnum 1-) inc %changed %qg
  4055. 4055 }
  4056. 4056
  4057. 4057 ; Limpieza fina de lookup/ipdone/last_ip si son restos sin socket real.
  4058. 4058 var %lg = $_barna_cachecap127_lookup_tail_gc
  4059. 4059 if (%lg isnum 1-) inc %changed %lg
  4060. 4060
  4061. 4061 ; SAQUIT: target menor que 125. Solo elimina grupos sin timer activo o cola vacia.
  4062. 4062 if ($var(%barna_saquit*,0) > 50) {
  4063. 4063 var %bs = $var(%barna_saquit*,0)
  4064. 4064 noop $_barna_saquit_gc_idle
  4065. 4065 var %as = $var(%barna_saquit*,0)
  4066. 4066 if (%as < %bs) inc %changed $calc(%bs - %as)
  4067. 4067
  4068. 4068 if ($var(%barna_saquit*,0) > 50) {
  4069. 4069 var %st = $_barna_cachecap127_trim_saquit_safe
  4070. 4070 if (%st isnum 1-) inc %changed %st
  4071. 4071 }
  4072. 4072 }
  4073. 4073
  4074. 4074 ; Dedupe/eco auxiliar: bajo presion usa umbrales moderados y expiracion diferida.
  4075. 4075 var %low_asn = 24
  4076. 4076 var %low_q = 8
  4077. 4077 var %low_echo = 4
  4078. 4078
  4079. 4079 var %ec = $var(%barna_echo_asn_seen.*,0)
  4080. 4080 if (%ec > %low_asn) {
  4081. 4081 var %todo = $calc(%ec - %low_asn)
  4082. 4082 if (%todo > 12) var %todo = 12
  4083. 4083 while (%todo > 0) {
  4084. 4084 if (!$_barna_cachecap127_delete_last_echo_asn_now) break
  4085. 4085 inc %changed
  4086. 4086 dec %todo
  4087. 4087 }
  4088. 4088 }
  4089. 4089
  4090. 4090 var %eq = $var(%barna_echo_q_seen.*,0)
  4091. 4091 if (%eq > %low_q) {
  4092. 4092 var %todo = $calc(%eq - %low_q)
  4093. 4093 if (%todo > 12) var %todo = 12
  4094. 4094 while (%todo > 0) {
  4095. 4095 if (!$_barna_cachecap127_delete_last_echo_q_now) break
  4096. 4096 inc %changed
  4097. 4097 dec %todo
  4098. 4098 }
  4099. 4099 }
  4100. 4100
  4101. 4101 var %es = $var(%barna_echo_seen.*,0)
  4102. 4102 if (%es > %low_echo) {
  4103. 4103 var %todo = $calc(%es - %low_echo)
  4104. 4104 if (%todo > 12) var %todo = 12
  4105. 4105 while (%todo > 0) {
  4106. 4106 if (!$_barna_cachecap127_delete_last_echo_seen_now) break
  4107. 4107 inc %changed
  4108. 4108 dec %todo
  4109. 4109 }
  4110. 4110 }
  4111. 4111
  4112. 4112 ; Estado de cola echo sobrante si no hay cola real.
  4113. 4113 if ($var(%barna_echo_q_*,0) > 10) {
  4114. 4114 var %qt = $_barna_cachecap127_trim_echo_queue_now
  4115. 4115 if (%qt isnum 1-) inc %changed %qt
  4116. 4116 }
  4117. 4117
  4118. 4118 ; Badnick temporal: bajo presion global, target moderado y expiracion diferida.
  4119. 4119 var %bad = $var(%barna_badnick.*,0)
  4120. 4120 if (%bad > 15) {
  4121. 4121 var %todo = $calc(%bad - 15)
  4122. 4122 if (%todo > 12) var %todo = 12
  4123. 4123 while (%todo > 0) {
  4124. 4124 if (!$_barna_cachecap127_delete_last_badnick_now) break
  4125. 4125 inc %changed
  4126. 4126 dec %todo
  4127. 4127 }
  4128. 4128 }
  4129. 4129
  4130. 4130 ; JOIN_DELAY: procesa maduros aunque no haya netburst grande. No descarta nicks.
  4131. 4131 if ($_barna_join_delay_count > 12) {
  4132. 4132 var %jg = $_barna_cachecap127_join_delay_pressure_gc
  4133. 4133 if (%jg isnum 1-) inc %changed %jg
  4134. 4134 }
  4135. 4135
  4136. 4136 set -u60 %barna_cachecap121_last_aux %changed
  4137. 4137 return %changed
  4138. 4138}
  4139. 4139
  4140. 4140alias _barna_cachecap117_run {
  4141. 4141 ; Build 132: esta rutina SOLO marca cache ASN por MARKGC.
  4142. 4142 ; El GC auxiliar se reparte por fases desde BarnaMaintenance.
  4143. 4143 _barna_cachecap117_defaults
  4144. 4144 if (%barna_cachecap117_enabled != 1) return 0
  4145. 4145 if (%barna_cachecap117_busy == 1) return 0
  4146. 4146
  4147. 4147 var %mode = $1
  4148. 4148 var %now = $ctime
  4149. 4149
  4150. 4150 if (%mode != force) {
  4151. 4151 if (%barna_cachecap117_last != $null) {
  4152. 4152 if ($calc(%now - %barna_cachecap117_last) < %barna_cachecap117_interval) return 0
  4153. 4153 }
  4154. 4154 }
  4155. 4155
  4156. 4156 set -u15 %barna_cachecap117_busy 1
  4157. 4157 set %barna_cachecap117_last %now
  4158. 4158
  4159. 4159 var %changed = 0
  4160. 4160 var %target = %barna_asn_cache_max_exact
  4161. 4161 var %hard = %barna_asn_cache_hard_limit
  4162. 4162 if (%target !isnum 50-) var %target = 120
  4163. 4163 if (%hard !isnum 80-) var %hard = 180
  4164. 4164
  4165. 4165 var %cache = $var(%barna_asn_cache_asn.*,0)
  4166. 4166 var %batch = $_barna_cachecap117_effective_batch(%cache)
  4167. 4167 if (%batch !isnum 1-) var %batch = 16
  4168. 4168
  4169. 4169 if ($_barna_cachecap121_should_drain) {
  4170. 4170 var %todo = $calc(%cache - %target)
  4171. 4171 if (%todo > %batch) var %todo = %batch
  4172. 4172 if (%todo < 1) var %todo = 1
  4173. 4173 var %d = $_barna_cachecap117_delete_batch_asn(%todo)
  4174. 4174 if (%d isnum 1-) inc %changed %d
  4175. 4175 }
  4176. 4176
  4177. 4177 if ($_barna_cachecap121_should_drain) set -u30 %barna_cachecap117_drain_requested 1
  4178. 4178 else unset %barna_cachecap117_drain_requested
  4179. 4179
  4180. 4180 set -u60 %barna_cachecap117_last_batch %batch
  4181. 4181 set -u60 %barna_cachecap120_last_marked %changed
  4182. 4182 unset %barna_cachecap117_busy
  4183. 4183 return %changed
  4184. 4184}
  4185. 4185
  4186. 4186alias _barna_cachecap117_tick {
  4187. 4187 ; Compatibilidad: una sola pasada cache-only, llamada por BarnaMaintenance.
  4188. 4188 _barna_cachecap117_defaults
  4189. 4189 if (%barna_cachecap117_enabled != 1) return 0
  4190. 4190 if (!$_barna_cachecap121_should_drain) return 0
  4191. 4191 return $_barna_cachecap117_run(force)
  4192. 4192}
  4193. 4193
  4194. 4194alias _barna_cachecap117_drain {
  4195. 4195 ; Compatibilidad: no se autorreprograma. Una pasada y solicitud al scheduler.
  4196. 4196 _barna_cachecap117_defaults
  4197. 4197 if (%barna_cachecap117_enabled != 1) return 0
  4198. 4198 var %c = $_barna_cachecap117_run(force)
  4199. 4199 if ($_barna_cachecap121_should_drain) set -u30 %barna_cachecap117_drain_requested 1
  4200. 4200 return %c
  4201. 4201}
  4202. 4202
  4203. 4203alias barna.cachecap117.install {
  4204. 4204 _barna_runtime_defaults
  4205. 4205 _barna_cachecap117_defaults
  4206. 4206 set %barna_cachecap117_enabled 1
  4207. 4207 set %barna_cachecap117_interval 5
  4208. 4208 set %barna_cachecap117_batch 16
  4209. 4209 unset %barna_cachecap117_busy
  4210. 4210 noop $_barna_cachecap117_run(force)
  4211. 4211 noop $_barna_cachecap117_start_drain
  4212. 4212 _barna_core_ensure_timers
  4213. 4213 echo -s [ASN] CACHECAP136 CRASHSAFE_FAIRPRESSURE_CAPACITY activado. MARKGC de cache separado; auxiliares escalonados por BarnaMaintenance sin solapamientos.
  4214. 4214 barna.cachecap117.status
  4215. 4215}
  4216. 4216
  4217. 4217alias barna.cachecap117.run {
  4218. 4218 _barna_runtime_defaults
  4219. 4219 var %c = $_barna_cachecap117_run(force)
  4220. 4220 echo -s [ASN] CACHECAP136 lote CACHE-ONLY ejecutado. marcadas= %c cacheASN= $var(%barna_asn_cache_asn.*,0) cacheISP= $var(%barna_asn_cache_name.*,0) cacheTS= $var(%barna_asn_cache_ts.*,0) batch_efectivo= %barna_cachecap117_last_batch lastkey= %barna_cachecap117_last_key marked= $var(%barna_cachecap120_marked.*,0) total_vars= $var(%barna_*,0)
  4221. 4221}
  4222. 4222
  4223. 4223alias barna.cachecap117.drain {
  4224. 4224 _barna_runtime_defaults
  4225. 4225 set %barna_cachecap117_enabled 1
  4226. 4226 set %barna_cachecap117_interval 5
  4227. 4227 if (%barna_cachecap117_batch < 16) set %barna_cachecap117_batch 16
  4228. 4228 unset %barna_cachecap117_busy
  4229. 4229 noop $_barna_cachecap117_run(force)
  4230. 4230 noop $_barna_cachecap117_start_drain
  4231. 4231 _barna_core_ensure_timers
  4232. 4232 echo -s [ASN] CACHECAP136 drenaje solicitado al scheduler. No crea timer rapido independiente.
  4233. 4233 barna.cachecap117.status
  4234. 4234}
  4235. 4235
  4236. 4236alias barna.cachecap117.status {
  4237. 4237 _barna_runtime_defaults
  4238. 4238 _barna_cachecap117_defaults
  4239. 4239 var %cache = $var(%barna_asn_cache_asn.*,0)
  4240. 4240 var %eff = $_barna_cachecap117_effective_batch(%cache)
  4241. 4241 echo -s [ASN] CACHECAP136 enabled= %barna_cachecap117_enabled cacheASN= %cache cacheISP= $var(%barna_asn_cache_name.*,0) cacheTS= $var(%barna_asn_cache_ts.*,0) target= %barna_asn_cache_max_exact hard= %barna_asn_cache_hard_limit batch= %barna_cachecap117_batch effective_batch= %eff interval= %barna_cachecap117_interval maint_timer= $timer(BarnaMaintenance) maint_phase= %barna_maintenance_phase maint_task= %barna_maintenance_last_task maint_cursor= %barna_maintenance_pressure_cursor lastkey= %barna_cachecap117_last_key marked= $var(%barna_cachecap120_marked.*,0) skipped_new= %barna_cachecap117_skip_new total_pressure= $_barna_cachecap121_total_pressure total_vars= $var(%barna_*,0)
  4242. 4242}
  4243. 4243
  4244. 4244alias barna.cachecap117.off {
  4245. 4245 set %barna_cachecap117_enabled 0
  4246. 4246 unset %barna_cachecap117_busy
  4247. 4247 unset %barna_cachecap117_drain_requested
  4248. 4248 .timerBarnaCacheCap117Drain off
  4249. 4249 echo -s [ASN] CACHECAP136 desactivado. BarnaMaintenance sigue para JOIN/WHOIP y limpieza minima escalonada.
  4250. 4250}
  4251. 4251
  4252. 4252
  4253. 4253; ------------------------------------------------------------
  4254. 4254; BLOQUE 7.5
  4255. 4255; BACKUP / RESTORE DE ASN POR CANAL
  4256. 4256; ------------------------------------------------------------
  4257. 4257
  4258. 4258alias _barna_asnbackup_file {
  4259. 4259 return $+($mircdir,barna_asn_backup.ini)
  4260. 4260}
  4261. 4261
  4262. 4262alias barna.asnbackup {
  4263. 4263 var %file = $_barna_asnbackup_file
  4264. 4264 var %asn_count = 0
  4265. 4265 var %chan_count = 0
  4266. 4266
  4267. 4267 if ($isfile(%file)) .remove $qt(%file)
  4268. 4268
  4269. 4269 writeini -n $qt(%file) meta saved_ctime $ctime
  4270. 4270 writeini -n $qt(%file) meta saved_date $date
  4271. 4271 writeini -n $qt(%file) meta saved_time $time
  4272. 4272 writeini -n $qt(%file) meta build %barna_build
  4273. 4273
  4274. 4274 var %i = 1
  4275. 4275 while (%i <= $var(%barna_asn.*,0)) {
  4276. 4276 var %v = $var(%barna_asn.*,%i)
  4277. 4277 var %key = $remove(%v,$+(%,barna_asn.))
  4278. 4278 var %val = $var(%barna_asn.*,%i).value
  4279. 4279
  4280. 4280 if (%key != $null) {
  4281. 4281 writeini -n $qt(%file) asn %key %val
  4282. 4282 inc %asn_count
  4283. 4283 }
  4284. 4284
  4285. 4285 inc %i
  4286. 4286 }
  4287. 4287
  4288. 4288 var %i = 1
  4289. 4289 while (%i <= $var(%barna_chan.*,0)) {
  4290. 4290 var %v = $var(%barna_chan.*,%i)
  4291. 4291 var %key = $remove(%v,$+(%,barna_chan.))
  4292. 4292 var %val = $var(%barna_chan.*,%i).value
  4293. 4293
  4294. 4294 if (%key != $null) {
  4295. 4295 writeini -n $qt(%file) chan %key %val
  4296. 4296 inc %chan_count
  4297. 4297 }
  4298. 4298
  4299. 4299 inc %i
  4300. 4300 }
  4301. 4301
  4302. 4302 echo -s [ASN] Backup ASN/canales guardado en: %file
  4303. 4303 echo -s [ASN] Backup contenido: canales= %chan_count ASN_por_canal= %asn_count
  4304. 4304}
  4305. 4305
  4306. 4306alias barna.asnrestore {
  4307. 4307 var %file = $_barna_asnbackup_file
  4308. 4308
  4309. 4309 if (!$isfile(%file)) {
  4310. 4310 echo -s [ASN] No existe backup ASN/canales: %file
  4311. 4311 echo -s [ASN] Ejecuta /barna.asnbackup cuando tengas los ASN correctos por canal.
  4312. 4312 return
  4313. 4313 }
  4314. 4314
  4315. 4315 var %asn_total = $ini($qt(%file),asn,0)
  4316. 4316 var %chan_total = $ini($qt(%file),chan,0)
  4317. 4317
  4318. 4318 if (%asn_total == $null) var %asn_total = 0
  4319. 4319 if (%chan_total == $null) var %chan_total = 0
  4320. 4320
  4321. 4321 if (%asn_total <= 0) {
  4322. 4322 echo -s [ASN] Backup encontrado pero sin entradas ASN. No se restaura nada.
  4323. 4323 return
  4324. 4324 }
  4325. 4325
  4326. 4326 var %i = $var(%barna_asn.*,0)
  4327. 4327 while (%i > 0) {
  4328. 4328 unset $var(%barna_asn.*,%i)
  4329. 4329 dec %i
  4330. 4330 }
  4331. 4331
  4332. 4332 var %i = $var(%barna_chan.*,0)
  4333. 4333 while (%i > 0) {
  4334. 4334 unset $var(%barna_chan.*,%i)
  4335. 4335 dec %i
  4336. 4336 }
  4337. 4337
  4338. 4338 var %rest_chan = 0
  4339. 4339 var %i = 1
  4340. 4340 while (%i <= %chan_total) {
  4341. 4341 var %key = $ini($qt(%file),chan,%i)
  4342. 4342 var %val = $readini($qt(%file),chan,%key)
  4343. 4343
  4344. 4344 if (%key != $null) {
  4345. 4345 var %name = $+(%,barna_chan.,%key)
  4346. 4346 set %name %val
  4347. 4347 inc %rest_chan
  4348. 4348 }
  4349. 4349
  4350. 4350 inc %i
  4351. 4351 }
  4352. 4352
  4353. 4353 var %rest_asn = 0
  4354. 4354 var %i = 1
  4355. 4355 while (%i <= %asn_total) {
  4356. 4356 var %key = $ini($qt(%file),asn,%i)
  4357. 4357 var %val = $readini($qt(%file),asn,%key)
  4358. 4358
  4359. 4359 if (%key != $null) {
  4360. 4360 var %name = $+(%,barna_asn.,%key)
  4361. 4361 set %name %val
  4362. 4362 inc %rest_asn
  4363. 4363 }
  4364. 4364
  4365. 4365 inc %i
  4366. 4366 }
  4367. 4367
  4368. 4368 echo -s [ASN] Restore ASN/canales aplicado desde: %file
  4369. 4369 echo -s [ASN] Restore contenido: canales= %rest_chan ASN_por_canal= %rest_asn
  4370. 4370}
  4371. 4371
  4372. 4372alias barna.varstatus {
  4373. 4373 ; Build 57: antes de imprimir, repara/despierta JOINGUARD si procede.
  4374. 4374 _barna_join_guard_gc
  4375. 4375 echo -s [ASN] Vars: total= $var(%barna_*,0) q= $var(%barna_q_*,0) userip= $var(%barna_userip_*,0) lookup= $var(%barna_lookup.*,0) lookup_chans= $var(%barna_lookup_chans.*,0) last_ip= $var(%barna_last_ip.*,0) ip_keep= $var(%barna_ip_keep.*,0) qry= $var(%barna_qry.*,0) ipdone= $var(%barna_ipdone.*,0) sock= $var(%barna_sock_*,0) sockdot= $var(%barna_sock.*,0) sock_nick= $var(%barna_sock_nick.*,0) sock_ip= $var(%barna_sock_ip.*,0) sock_id= $var(%barna_sock_id.*,0) rx= $var(%barna_rx.*,0) asn_done= $var(%barna_asn_done.*,0) asn_cache_asn= $var(%barna_asn_cache_asn.*,0) asn_cache_name= $var(%barna_asn_cache_name.*,0) asn_cache_ts= $var(%barna_asn_cache_ts.*,0) badpfx2= $var(%barna_badpfx2.*,0) badpfx3= $var(%barna_badpfx3.*,0) badnick= $var(%barna_badnick.*,0) badnick_ip= $var(%barna_badnick_ip.*,0) badnick_chans= $var(%barna_badnick_chans.*,0) seen= $var(%barna_seen.*,0) joinfix= $var(%barna_joinfix_*,0) jguard= $var(%barna_jguard*,0) seenguard= $var(%barna_seen_rescue_recent.*,0) saquit= $var(%barna_saquit*,0)
  4376. 4376}
  4377. 4377
  4378. 4378alias barna.varclean {
  4379. 4379 ; Limpieza segura de variables voluminosas. No borra %barna_badpfx2.* ni %barna_badpfx3.*
  4380. 4380 barna.cachereset
  4381. 4381
  4382. 4382 _barna_q_clear_ghost_light
  4383. 4383
  4384. 4384 if ($_barna_q_idle_gc) {
  4385. 4385 echo -s [ASN] Variables de cola ASN idle limpiadas completamente. No habia cola ASN real.
  4386. 4386 }
  4387. 4387 elseif ($_barna_q_compact_vars) {
  4388. 4388 echo -s [ASN] Variables de cola ASN compactadas. Se conservan solo IDs vivos.
  4389. 4389 }
  4390. 4390 else {
  4391. 4391 echo -s [ASN] No se compacta % $+ barna_q_* porque hay socket/running activo o no hay nada que compactar.
  4392. 4392 }
  4393. 4393
  4394. 4394 if ($_barna_userip_vartrim_idle) {
  4395. 4395 echo -s [ASN] Variables WHOIP temporales compactadas/limpiadas. Puede descartar pocos pendientes viejos para proteger mIRC.
  4396. 4396 }
  4397. 4397 else {
  4398. 4398 echo -s [ASN] No se limpian % $+ barna_userip_* porque hay demasiados WHOIP pendientes o no excede limite.
  4399. 4399 }
  4400. 4400
  4401. 4401 if ($_barna_saquit_compact_vars) {
  4402. 4402 echo -s [ASN] Variables SAQUIT compactadas. Se conservan cola y enviados pendientes.
  4403. 4403 }
  4404. 4404 else {
  4405. 4405 echo -s [ASN] Variables SAQUIT sin cambios o ya compactadas.
  4406. 4406 }
  4407. 4407
  4408. 4408 barna.varstatus
  4409. 4409}
  4410. 4410
  4411. 4411alias _barna_runtime_defaults {
  4412. 4412 set %barna_build ASN_ULTRASAFE_BALANCEDSHED_ASNFAST_TRACE_DIRECT136_IPINFO_HTTPS_UTF8_2026_06_24
  4413. 4413 if (%barna_addon == $null) set %barna_addon 1
  4414. 4414 if (%barna_q_max_retries == $null) set %barna_q_max_retries 0
  4415. 4415 if (%barna_q_stale_secs == $null) set %barna_q_stale_secs 180
  4416. 4416 if (%barna_q_stale_secs > 180) set %barna_q_stale_secs 180
  4417. 4417 if (%barna_q_low_delay == $null) set %barna_q_low_delay 20
  4418. 4418 if (%barna_q_max_workers == $null) set %barna_q_max_workers 1
  4419. 4419 if (%barna_q_delay == $null) set %barna_q_delay 2
  4420. 4420 if (%barna_asn_pump_delay == $null) set %barna_asn_pump_delay 3
  4421. 4421 set %barna_core_tick_delay 5
  4422. 4422 set %barna_core_minimal 1
  4423. 4423 set %barna_whoip_lightvars 1
  4424. 4424 set %barna_userip_q_batch_max 2
  4425. 4425 set %barna_userip_q_batch_delay 1
  4426. 4426 set %barna_userip_turbo_threshold 10
  4427. 4427 set %barna_userip_turbo_batch_max 3
  4428. 4428 if (%barna_userip_turbo_delay == $null) set %barna_userip_turbo_delay 1
  4429. 4429 set %barna_userip_emergency_threshold 30
  4430. 4430 set %barna_userip_emergency_batch_max 3
  4431. 4431 if (%barna_userip_emergency_delay == $null) set %barna_userip_emergency_delay 1
  4432. 4432 set %barna_userip_q_max_pending 400
  4433. 4433 set %barna_userip_q_shed_to 0
  4434. 4434 set %barna_userip_no_shed 1
  4435. 4435 if (%barna_userip_state_ttl == $null) set %barna_userip_state_ttl 60
  4436. 4436 if (%barna_userip_state_ttl > 60) set %barna_userip_state_ttl 60
  4437. 4437 if (%barna_userip_state_ttl < 30) set %barna_userip_state_ttl 30
  4438. 4438 if (%barna_userip_drop_count == $null) set %barna_userip_drop_count 0
  4439. 4439 if (%barna_hygiene_secs == $null) set %barna_hygiene_secs 60
  4440. 4440 if (%barna_asn_cache_max_exact == $null) set %barna_asn_cache_max_exact 120
  4441. 4441 if (%barna_q_var_max_idle == $null) set %barna_q_var_max_idle 120
  4442. 4442 if (%barna_q_var_max_active == $null) set %barna_q_var_max_active 120
  4443. 4443 if (%barna_userip_var_max_idle == $null) set %barna_userip_var_max_idle 80
  4444. 4444 if (%barna_saquit_var_max_idle == $null) set %barna_saquit_var_max_idle 45
  4445. 4445 set %barna_echo_queue 1
  4446. 4446 set %barna_echo_q_batch_max 6
  4447. 4447 set %barna_echo_q_delay 1
  4448. 4448 set %barna_echo_q_max 160
  4449. 4449 if (%barna_join_audit == $null) set %barna_join_audit 0
  4450. 4450 if (%barna_join_audit_delay == $null) set %barna_join_audit_delay 60
  4451. 4451 if (%barna_join_audit_batch == $null) set %barna_join_audit_batch 10
  4452. 4452 if (%barna_join_audit_max_retries == $null) set %barna_join_audit_max_retries 0
  4453. 4453
  4454. 4454 ; Build 110: rescate automatico ultraligero de lookup/qry atascados sin depender de /barna.trace.
  4455. 4455 set %barna_userip_stuck_rescue 1
  4456. 4456 if (%barna_userip_stuck_rescue_secs == $null) set %barna_userip_stuck_rescue_secs 1
  4457. 4457 if (%barna_userip_stuck_rescue_secs > 1) set %barna_userip_stuck_rescue_secs 1
  4458. 4458 if (%barna_userip_stuck_rescue_batch == $null) set %barna_userip_stuck_rescue_batch 10
  4459. 4459 if (%barna_userip_stuck_rescue_batch > 10) set %barna_userip_stuck_rescue_batch 10
  4460. 4460 if (%barna_userip_stuck_rescue_recent_ttl == $null) set %barna_userip_stuck_rescue_recent_ttl 25
  4461. 4461 if (%barna_userip_stuck_rescue_recent_ttl > 25) set %barna_userip_stuck_rescue_recent_ttl 25
  4462. 4462
  4463. 4463 ; Build 115: JOINDELAY_LIGHTGC. AUTONICKSCAN desactivado; solo JOIN con delay.
  4464. 4464 set %barna_autonickscan 0
  4465. 4465 if (%barna_join_delay_secs == $null) set %barna_join_delay_secs 2
  4466. 4466 if (%barna_join_delay_secs < 1) set %barna_join_delay_secs 1
  4467. 4467 if (%barna_join_delay_secs > 2) set %barna_join_delay_secs 2
  4468. 4468 set %barna_join_delay_lightvars 1
  4469. 4469 if (%barna_join_delay_gc_age == $null) set %barna_join_delay_gc_age 12
  4470. 4470 if (%barna_join_delay_gc_age < 6) set %barna_join_delay_gc_age 6
  4471. 4471 if (%barna_join_delay_gc_age > 30) set %barna_join_delay_gc_age 30
  4472. 4472 if (%barna_join_delay_max_pending == $null) set %barna_join_delay_max_pending 70
  4473. 4473 if (%barna_join_delay_max_pending < 40) set %barna_join_delay_max_pending 40
  4474. 4474 if (%barna_join_delay_max_pending > 200) set %barna_join_delay_max_pending 200
  4475. 4475 if (%barna_join_delay_fast_threshold == $null) set %barna_join_delay_fast_threshold 24
  4476. 4476 if (%barna_join_delay_fast_threshold < 15) set %barna_join_delay_fast_threshold 15
  4477. 4477 if (%barna_join_delay_fast_threshold > 80) set %barna_join_delay_fast_threshold 80
  4478. 4478 if (%barna_join_delay_fast_batch == $null) set %barna_join_delay_fast_batch 10
  4479. 4479 if (%barna_join_delay_fast_batch < 2) set %barna_join_delay_fast_batch 2
  4480. 4480 if (%barna_join_delay_fast_batch > 18) set %barna_join_delay_fast_batch 18
  4481. 4481 if (%barna_join_delay_fast_age == $null) set %barna_join_delay_fast_age 2
  4482. 4482 if (%barna_join_delay_fast_age < 1) set %barna_join_delay_fast_age 1
  4483. 4483 if (%barna_join_delay_fast_age > 4) set %barna_join_delay_fast_age 4
  4484. 4484 if (%barna_whoip_watchdog_secs == $null) set %barna_whoip_watchdog_secs 8
  4485. 4485 if (%barna_whoip_watchdog_secs < 5) set %barna_whoip_watchdog_secs 5
  4486. 4486 if (%barna_whoip_watchdog_secs > 15) set %barna_whoip_watchdog_secs 15
  4487. 4487 if (%barna_whoip_watchdog_fallback_secs == $null) set %barna_whoip_watchdog_fallback_secs 10
  4488. 4488 if (%barna_whoip_watchdog_fallback_secs < 6) set %barna_whoip_watchdog_fallback_secs 6
  4489. 4489 if (%barna_whoip_watchdog_fallback_secs > 20) set %barna_whoip_watchdog_fallback_secs 20
  4490. 4490 if (%barna_autonickscan_secs == $null) set %barna_autonickscan_secs 6
  4491. 4491 if (%barna_autonickscan_secs > 6) set %barna_autonickscan_secs 6
  4492. 4492 if (%barna_autonickscan_batch == $null) set %barna_autonickscan_batch 12
  4493. 4493 if (%barna_autonickscan_batch > 12) set %barna_autonickscan_batch 12
  4494. 4494 if (%barna_autonickscan_recent_ttl == $null) set %barna_autonickscan_recent_ttl 90
  4495. 4495 if (%barna_autonickscan_recent_ttl > 90) set %barna_autonickscan_recent_ttl 90
  4496. 4496 if (%barna_autonickscan_q_limit == $null) set %barna_autonickscan_q_limit 60
  4497. 4497 if (%barna_autonickscan_q_limit > 80) set %barna_autonickscan_q_limit 80
  4498. 4498
  4499. 4499 ; VARHYGIENE54: JOINGUARD ultraligero.
  4500. 4500 set %barna_join_guard 0
  4501. 4501 if (%barna_join_guard_delay == $null) set %barna_join_guard_delay 7
  4502. 4502 if (%barna_join_guard_ttl == $null) set %barna_join_guard_ttl 25
  4503. 4503 if (%barna_join_guard_max == $null) set %barna_join_guard_max 60
  4504. 4504 if (%barna_join_guard_batch == $null) set %barna_join_guard_batch 8
  4505. 4505
  4506. 4506 ; VARHYGIENE60: SEENGUARD_NOMISS. Escaneo ligero de nicks vistos sin consulta activa.
  4507. 4507 set %barna_seen_rescue 0
  4508. 4508 if (%barna_seen_rescue_secs == $null) set %barna_seen_rescue_secs 10
  4509. 4509 if (%barna_seen_rescue_batch == $null) set %barna_seen_rescue_batch 20
  4510. 4510 if (%barna_seen_rescue_batch > 30) set %barna_seen_rescue_batch 30
  4511. 4511 if (%barna_joinfix_gc_delay == $null) set %barna_joinfix_gc_delay 5
  4512. 4512 if (%barna_boot_delay == $null) set %barna_boot_delay 3
  4513. 4513 if (%barna_asn_pump_permanent == $null) set %barna_asn_pump_permanent 1
  4514. 4514 if (%barna_heavy_gc_secs == $null) set %barna_heavy_gc_secs 20
  4515. 4515 if (%barna_badpfx_ttl == $null) set %barna_badpfx_ttl 900
  4516. 4516 if (%barna_badpfx_ttl > 900) set %barna_badpfx_ttl 900
  4517. 4517 if (%barna_badpfx2_max_vars == $null) set %barna_badpfx2_max_vars 40
  4518. 4518 if (%barna_badpfx3_max_vars == $null) set %barna_badpfx3_max_vars 80
  4519. 4519 set %barna_seen_max_vars 0
  4520. 4520 set %barna_echo_seen_max_vars 40
  4521. 4521 if (%barna_saquit_emergency_max_vars == $null) set %barna_saquit_emergency_max_vars 300
  4522. 4522 if (%barna_saquit_emergency_max_queue == $null) set %barna_saquit_emergency_max_queue 50
  4523. 4523 if (%barna_saquit_pump_batch == $null) set %barna_saquit_pump_batch 3
  4524. 4524
  4525. 4525 ; VARHYGIENE50 HIGHFLOW_GC:
  4526. 4526 ; En canales de mucha afluencia, el lag viene por acumulacion de variables temporales.
  4527. 4527 ; Este modo NO toca %barna_chan.* ni %barna_asn.*.
  4528. 4528 if (%barna_highflow_gc == $null) set %barna_highflow_gc 1
  4529. 4529 if (%barna_total_max_vars == $null) set %barna_total_max_vars 900
  4530. 4530 if (%barna_total_max_vars > 700) set %barna_total_max_vars 900
  4531. 4531
  4532. 4532 if (%barna_highflow_gc == 1) {
  4533. 4533 if (%barna_heavy_gc_secs == $null) set %barna_heavy_gc_secs 8
  4534. 4534 if (%barna_heavy_gc_secs > 8) set %barna_heavy_gc_secs 8
  4535. 4535 if (%barna_sockvar_gc_secs == $null) set %barna_sockvar_gc_secs 5
  4536. 4536 if (%barna_sockvar_gc_secs > 5) set %barna_sockvar_gc_secs 5
  4537. 4537 if (%barna_lookup_max_vars == $null) set %barna_lookup_max_vars 100
  4538. 4538 if (%barna_lookup_max_vars > 100) set %barna_lookup_max_vars 100
  4539. 4539 if (%barna_lastip_max_vars == $null) set %barna_lastip_max_vars 120
  4540. 4540 if (%barna_lastip_max_vars > 120) set %barna_lastip_max_vars 120
  4541. 4541 if (%barna_lookup_total_max_vars == $null) set %barna_lookup_total_max_vars 250
  4542. 4542 if (%barna_lookup_total_max_vars > 250) set %barna_lookup_total_max_vars 250
  4543. 4543 if (%barna_sockvar_max_vars == $null) set %barna_sockvar_max_vars 25
  4544. 4544 if (%barna_sockvar_max_vars > 25) set %barna_sockvar_max_vars 25
  4545. 4545 if (%barna_seen_max_vars == $null) set %barna_seen_max_vars 350
  4546. 4546 if (%barna_seen_max_vars > 350) set %barna_seen_max_vars 350
  4547. 4547 if (%barna_echo_seen_max_vars == $null) set %barna_echo_seen_max_vars 120
  4548. 4548 if (%barna_echo_seen_max_vars > 120) set %barna_echo_seen_max_vars 120
  4549. 4549 if (%barna_badnick_max_vars == $null) set %barna_badnick_max_vars 90
  4550. 4550 if (%barna_badnick_max_vars > 90) set %barna_badnick_max_vars 90
  4551. 4551 if (%barna_badpfx2_max_vars == $null) set %barna_badpfx2_max_vars 12
  4552. 4552 if (%barna_badpfx2_max_vars > 12) set %barna_badpfx2_max_vars 12
  4553. 4553 if (%barna_badpfx3_max_vars == $null) set %barna_badpfx3_max_vars 25
  4554. 4554 if (%barna_badpfx3_max_vars > 25) set %barna_badpfx3_max_vars 25
  4555. 4555 if (%barna_userip_var_max_idle == $null) set %barna_userip_var_max_idle 50
  4556. 4556 if (%barna_userip_var_max_idle > 50) set %barna_userip_var_max_idle 50
  4557. 4557 if (%barna_q_var_max_idle == $null) set %barna_q_var_max_idle 60
  4558. 4558 if (%barna_q_var_max_idle > 60) set %barna_q_var_max_idle 60
  4559. 4559 if (%barna_q_var_max_active == $null) set %barna_q_var_max_active 80
  4560. 4560 if (%barna_q_var_max_active > 80) set %barna_q_var_max_active 80
  4561. 4561 if (%barna_join_guard_max == $null) set %barna_join_guard_max 60
  4562. 4562 if (%barna_join_guard_max > 60) set %barna_join_guard_max 60
  4563. 4563 if (%barna_join_guard_batch == $null) set %barna_join_guard_batch 8
  4564. 4564 if (%barna_join_guard_batch > 8) set %barna_join_guard_batch 8
  4565. 4565 if (%barna_join_guard_ttl == $null) set %barna_join_guard_ttl 25
  4566. 4566 if (%barna_join_guard_ttl > 25) set %barna_join_guard_ttl 25
  4567. 4567 }
  4568. 4568}
  4569. 4569
  4570. 4570; ------------------------------------------------------------
  4571. 4571; BUILD 133: MANTENIMIENTO JUSTO CON CAPACIDAD ADAPTATIVA
  4572. 4572; Una sola tarea auxiliar por ciclo. Nunca ejecuta varios GC pesados juntos.
  4573. 4573; ------------------------------------------------------------
  4574. 4574alias _barna_maintenance_tick {
  4575. 4575 if (%barna_addon != 1) {
  4576. 4576 .timerBarnaMaintenance off
  4577. 4577 unset %barna_maintenance_busy
  4578. 4578 return
  4579. 4579 }
  4580. 4580
  4581. 4581 if (%barna_maintenance_busy == 1) return
  4582. 4582 set -u8 %barna_maintenance_busy 1
  4583. 4583
  4584. 4584 _barna_runtime_defaults
  4585. 4585 _barna_cachecap117_defaults
  4586. 4586
  4587. 4587 var %pressure = $_barna_cachecap121_total_pressure
  4588. 4588 var %total = $var(%barna_*,0)
  4589. 4589 var %critical = 0
  4590. 4590 if (%total > 1050) var %critical = 1
  4591. 4591 var %cache = $var(%barna_asn_cache_asn.*,0)
  4592. 4592 var %target = %barna_asn_cache_max_exact
  4593. 4593 var %hard = %barna_asn_cache_hard_limit
  4594. 4594 if (%target !isnum 50-) var %target = 120
  4595. 4595 if (%hard !isnum 80-) var %hard = 180
  4596. 4596
  4597. 4597 ; Build 133: mantiene UNA sola familia por tick. Bajo presion aumenta
  4598. 4598 ; solamente el trabajo de la familia elegida y da prioridad alterna a
  4599. 4599 ; cache alta, sin volver a mezclar varios GC en el mismo ciclo.
  4600. 4600 if (%pressure == 1) {
  4601. 4601 var %done = 0
  4602. 4602 var %task = none
  4603. 4603
  4604. 4604 ; Cache al hard siempre tiene prioridad. Por encima de 150 recibe turno
  4605. 4605 ; preferente, pero nunca dos turnos cache consecutivos.
  4606. 4606 if ((%cache >= %hard) && ($_barna_cachecap121_should_drain)) {
  4607. 4607 noop $_barna_cachecap117_run(force)
  4608. 4608 var %done = 1
  4609. 4609 var %task = cache_hard
  4610. 4610 }
  4611. 4611 elseif ((%cache > 150) && (%barna_maintenance_last_task != cache_high) && (%barna_maintenance_last_task != cache_hard) && ($_barna_cachecap121_should_drain)) {
  4612. 4612 noop $_barna_cachecap117_run(force)
  4613. 4613 var %done = 1
  4614. 4614 var %task = cache_high
  4615. 4615 }
  4616. 4616
  4617. 4617 ; JOIN_DELAY puede recibir como maximo un turno de cada dos.
  4618. 4618 if ((%done == 0) && ($_barna_join_delay_count > 12) && (%barna_maintenance_last_task != join_delay)) {
  4619. 4619 noop $_barna_cachecap127_join_delay_pressure_gc
  4620. 4620 var %done = 1
  4621. 4621 var %task = join_delay
  4622. 4622 }
  4623. 4623
  4624. 4624 ; Rotacion justa del resto. En presion critica aumenta el lote de la
  4625. 4625 ; familia elegida, pero sigue siendo una unica familia en este tick.
  4626. 4626 if (%done == 0) {
  4627. 4627 var %tries = 0
  4628. 4628 var %slot = %barna_maintenance_pressure_cursor
  4629. 4629 if (%slot !isnum 0-8) var %slot = 0
  4630. 4630
  4631. 4631 while ((%tries < 8) && (%done == 0)) {
  4632. 4632 inc %slot
  4633. 4633 if (%slot > 8) var %slot = 1
  4634. 4634 inc %tries
  4635. 4635
  4636. 4636 if (%slot == 1) {
  4637. 4637 if (($_barna_userip_q_count > 0) || ($var(%barna_lookup.*,0) > 0) || ($var(%barna_qry.*,0) > 0)) {
  4638. 4638 noop $_barna_userip_stuck_rescue_tick
  4639. 4639 var %done = 1
  4640. 4640 var %task = whoip_rescue
  4641. 4641 }
  4642. 4642 }
  4643. 4643 elseif (%slot == 2) {
  4644. 4644 if ($var(%barna_echo_asn_seen.*,0) > 24) {
  4645. 4645 var %limit = 4
  4646. 4646 if (%critical == 1) var %limit = 7
  4647. 4647 var %i = 0
  4648. 4648 while (%i < %limit) {
  4649. 4649 if (!$_barna_cachecap127_delete_last_echo_asn_now) break
  4650. 4650 inc %i
  4651. 4651 }
  4652. 4652 var %done = 1
  4653. 4653 var %task = echo_asn
  4654. 4654 }
  4655. 4655 }
  4656. 4656 elseif (%slot == 3) {
  4657. 4657 if (($var(%barna_echo_q_*,0) > 12) && (%barna_echo_q_head == $null) && (%barna_echo_q_tail == $null)) {
  4658. 4658 noop $_barna_cachecap127_trim_echo_queue_now
  4659. 4659 var %done = 1
  4660. 4660 var %task = echo_q_state
  4661. 4661 }
  4662. 4662 elseif ($var(%barna_echo_q_seen.*,0) > 8) {
  4663. 4663 var %limit = 3
  4664. 4664 if (%critical == 1) var %limit = 5
  4665. 4665 var %i = 0
  4666. 4666 while (%i < %limit) {
  4667. 4667 if (!$_barna_cachecap127_delete_last_echo_q_now) break
  4668. 4668 inc %i
  4669. 4669 }
  4670. 4670 var %done = 1
  4671. 4671 var %task = echo_q_seen
  4672. 4672 }
  4673. 4673 }
  4674. 4674 elseif (%slot == 4) {
  4675. 4675 if ($var(%barna_badnick.*,0) > 15) {
  4676. 4676 var %limit = 3
  4677. 4677 if (%critical == 1) var %limit = 5
  4678. 4678 var %i = 0
  4679. 4679 while (%i < %limit) {
  4680. 4680 if (!$_barna_cachecap127_delete_last_badnick_now) break
  4681. 4681 inc %i
  4682. 4682 }
  4683. 4683 var %done = 1
  4684. 4684 var %task = badnick
  4685. 4685 }
  4686. 4686 }
  4687. 4687 elseif (%slot == 5) {
  4688. 4688 if ($var(%barna_saquit*,0) > 35) {
  4689. 4689 var %limit = 1
  4690. 4690 if (%critical == 1) var %limit = 2
  4691. 4691 var %i = 0
  4692. 4692 while (%i < %limit) {
  4693. 4693 if (!$_barna_cachecap127_delete_last_saquit_notimer) break
  4694. 4694 inc %i
  4695. 4695 }
  4696. 4696 var %done = 1
  4697. 4697 var %task = saquit
  4698. 4698 }
  4699. 4699 }
  4700. 4700 elseif (%slot == 6) {
  4701. 4701 if (($_barna_ipinfo_sock_count == 0) && ($_barna_sockvar_count > 8)) {
  4702. 4702 noop $_barna_sockvar_gc
  4703. 4703 var %done = 1
  4704. 4704 var %task = sock_state
  4705. 4705 }
  4706. 4706 }
  4707. 4707 elseif (%slot == 7) {
  4708. 4708 if ($var(%barna_echo_seen.*,0) > 4) {
  4709. 4709 var %limit = 2
  4710. 4710 if (%critical == 1) var %limit = 3
  4711. 4711 var %i = 0
  4712. 4712 while (%i < %limit) {
  4713. 4713 if (!$_barna_cachecap127_delete_last_echo_seen_now) break
  4714. 4714 inc %i
  4715. 4715 }
  4716. 4716 var %done = 1
  4717. 4717 var %task = echo_seen
  4718. 4718 }
  4719. 4719 }
  4720. 4720 elseif (%slot == 8) {
  4721. 4721 if ((%cache > $calc(%target + 8)) && ($_barna_cachecap121_should_drain)) {
  4722. 4722 noop $_barna_cachecap117_run(force)
  4723. 4723 var %done = 1
  4724. 4724 var %task = cache_pressure
  4725. 4725 }
  4726. 4726 }
  4727. 4727 }
  4728. 4728
  4729. 4729 set %barna_maintenance_pressure_cursor %slot
  4730. 4730 }
  4731. 4731
  4732. 4732 ; Si ninguna otra familia necesitaba trabajo, JOIN_DELAY puede repetir.
  4733. 4733 if ((%done == 0) && ($_barna_join_delay_count > 12)) {
  4734. 4734 noop $_barna_cachecap127_join_delay_pressure_gc
  4735. 4735 var %done = 1
  4736. 4736 var %task = join_delay
  4737. 4737 }
  4738. 4738
  4739. 4739 set -u120 %barna_maintenance_last_task %task
  4740. 4740 if (%done == 1) {
  4741. 4741 unset %barna_maintenance_busy
  4742. 4742 return
  4743. 4743 }
  4744. 4744 }
  4745. 4745
  4746. 4746 ; Sin presion, la cache solo tiene prioridad si supera el limite duro.
  4747. 4747 if ((%barna_cachecap117_enabled == 1) && (%cache > %hard)) {
  4748. 4748 noop $_barna_cachecap117_run(force)
  4749. 4749 set -u120 %barna_maintenance_last_task cache_hard
  4750. 4750 unset %barna_maintenance_busy
  4751. 4751 return
  4752. 4752 }
  4753. 4753
  4754. 4754 var %phase = %barna_maintenance_phase
  4755. 4755 if (%phase !isnum 0-8) var %phase = 0
  4756. 4756 inc %phase
  4757. 4757 if (%phase > 8) var %phase = 1
  4758. 4758 set %barna_maintenance_phase %phase
  4759. 4759
  4760. 4760 ; Modo normal: una familia por fase, con umbrales prudentes.
  4761. 4761 if (%phase == 1) {
  4762. 4762 set -u120 %barna_maintenance_last_task join_pressure
  4763. 4763 if ($_barna_join_delay_count > 12) noop $_barna_cachecap127_join_delay_pressure_gc
  4764. 4764 }
  4765. 4765 elseif (%phase == 2) {
  4766. 4766 set -u120 %barna_maintenance_last_task join_gc
  4767. 4767 noop $_barna_join_delay_gc_tick
  4768. 4768 }
  4769. 4769 elseif (%phase == 3) {
  4770. 4770 set -u120 %barna_maintenance_last_task whoip_rescue
  4771. 4771 noop $_barna_userip_stuck_rescue_tick
  4772. 4772 }
  4773. 4773 elseif (%phase == 4) {
  4774. 4774 set -u120 %barna_maintenance_last_task echo_asn
  4775. 4775 if ($var(%barna_echo_asn_seen.*,0) > 24) noop $_barna_cachecap127_delete_last_echo_asn_now
  4776. 4776 }
  4777. 4777 elseif (%phase == 5) {
  4778. 4778 set -u120 %barna_maintenance_last_task echo_q
  4779. 4779 if (($var(%barna_echo_q_*,0) > 12) && (%barna_echo_q_head == $null) && (%barna_echo_q_tail == $null)) noop $_barna_cachecap127_trim_echo_queue_now
  4780. 4780 elseif ($var(%barna_echo_q_seen.*,0) > 8) noop $_barna_cachecap127_delete_last_echo_q_now
  4781. 4781 }
  4782. 4782 elseif (%phase == 6) {
  4783. 4783 set -u120 %barna_maintenance_last_task badnick
  4784. 4784 if ($var(%barna_badnick.*,0) > 15) noop $_barna_cachecap127_delete_last_badnick_now
  4785. 4785 }
  4786. 4786 elseif (%phase == 7) {
  4787. 4787 set -u120 %barna_maintenance_last_task saquit
  4788. 4788 if ($var(%barna_saquit*,0) > 40) noop $_barna_cachecap127_delete_last_saquit_notimer
  4789. 4789 }
  4790. 4790 elseif (%phase == 8) {
  4791. 4791 set -u120 %barna_maintenance_last_task sock_state
  4792. 4792 if (($_barna_ipinfo_sock_count == 0) && ($_barna_sockvar_count > 15)) noop $_barna_sockvar_gc
  4793. 4793 }
  4794. 4794
  4795. 4795 unset %barna_maintenance_busy
  4796. 4796}
  4797. 4797
  4798. 4798; ------------------------------------------------------------
  4799. 4799; BLOQUE 3.5
  4800. 4800; ARRANQUE AUTOMATICO Y TIMERS PERMANENTES
  4801. 4801; ------------------------------------------------------------
  4802. 4802
  4803. 4803alias _barna_core_ensure_timers {
  4804. 4804 if (%barna_addon != 1) return
  4805. 4805
  4806. 4806 _barna_runtime_defaults
  4807. 4807
  4808. 4808 var %cdelay = %barna_core_tick_delay
  4809. 4809 if (%cdelay !isnum 1-) var %cdelay = 2
  4810. 4810
  4811. 4811 var %adelay = %barna_asn_pump_delay
  4812. 4812 if (%adelay !isnum 1-) var %adelay = 2
  4813. 4813 if (%adelay < 2) var %adelay = 2
  4814. 4814
  4815. 4815 var %jdelay = %barna_joinfix_gc_delay
  4816. 4816 if (%jdelay !isnum 3-) var %jdelay = 5
  4817. 4817
  4818. 4818 if ($timer(BarnaCoreTick) == $null) {
  4819. 4819 set -u300 %barna_core_tick_running 1
  4820. 4820 .timerBarnaCoreTick 0 %cdelay _barna_core_tick
  4821. 4821 }
  4822. 4822
  4823. 4823 if ($timer(BarnaASNPump) == $null) {
  4824. 4824 set -u300 %barna_asn_pump_running 1
  4825. 4825 set -u300 %barna_asn_pump_armed 1
  4826. 4826 .timerBarnaASNPump 0 %adelay _barna_asn_pump_tick
  4827. 4827 }
  4828. 4828
  4829. 4829 if ($timer(barna_joinfix_gc) == $null) {
  4830. 4830 .timerbarna_joinfix_gc 0 %jdelay barna.joinfixgc.run
  4831. 4831 }
  4832. 4832
  4833. 4833 ; Build 133: mantenimiento pesado fuera de CoreTick, una familia por tick y capacidad adaptativa bajo presion.
  4834. 4834 if ($timer(BarnaMaintenance) == $null) {
  4835. 4835 .timerBarnaMaintenance 0 5 _barna_maintenance_tick
  4836. 4836 }
  4837. 4837}
  4838. 4838
  4839. 4839alias _barna_core_stop_timers {
  4840. 4840 .timerBarnaCoreTick off
  4841. 4841 .timerBarnaASNPump off
  4842. 4842 .timerbarna_joinfix_gc off
  4843. 4843 .timerBarnaMaintenance off
  4844. 4844 unset %barna_maintenance_busy
  4845. 4845 unset %barna_core_tick_running
  4846. 4846 unset %barna_core_tick_busy
  4847. 4847 unset %barna_asn_pump_running
  4848. 4848 unset %barna_asn_pump_armed
  4849. 4849}
  4850. 4850
  4851. 4851alias _barna_autostart {
  4852. 4852 _barna_runtime_defaults
  4853. 4853
  4854. 4854 if (%barna_addon != 1) return
  4855. 4855
  4856. 4856 _barna_core_ensure_timers
  4857. 4857 _barna_q_clear_ghost_light
  4858. 4858 noop $_barna_sockto_orphan_gc
  4859. 4859 noop $_barna_sockvar_gc_tick
  4860. 4860 noop $_barna_q_idle_gc
  4861. 4861 noop $_barna_ipkeep_gc_tick
  4862. 4862
  4863. 4863 ; VARHYGIENE20: compactacion ligera frecuente cuando el contador de variables
  4864. 4864 ; crece mucho respecto a la cola real y no hay socket visible.
  4865. 4865 if ($_barna_ipinfo_sock_count == 0) {
  4866. 4866 var %qv_ct = $var(%barna_q_*,0)
  4867. 4867 var %live_ct = $calc($numtok(%barna_q_items,44) + $numtok(%barna_q_low_items,44))
  4868. 4868 var %allow_ct = $calc((%live_ct * 10) + 40)
  4869. 4869 if (%allow_ct < 40) var %allow_ct = 40
  4870. 4870 if (%qv_ct > %allow_ct) noop $_barna_q_compact_vars
  4871. 4871 }
  4872. 4872
  4873. 4873 noop $_barna_saquit_q_repair
  4874. 4874 noop $_barna_saquit_gc_idle
  4875. 4875
  4876. 4876 if ($_barna_saquit_q_count > 0) _barna_saquit_q_start
  4877. 4877
  4878. 4878 if ($1 == manual) {
  4879. 4879 echo -s [ASN] Inicializacion OK. Build: %barna_build
  4880. 4880 }
  4881. 4881}
  4882. 4882
  4883. 4883on *:START:{
  4884. 4884 _barna_runtime_defaults
  4885. 4885 if (%barna_addon == 1) .timerBarnaBoot 1 3 _barna_autostart START
  4886. 4886}
  4887. 4887
  4888. 4888on *:CONNECT:{
  4889. 4889 _barna_runtime_defaults
  4890. 4890 if (%barna_addon == 1) .timerBarnaBoot 1 3 _barna_autostart CONNECT
  4891. 4891}
  4892. 4892
  4893. 4893on *:LOAD:{
  4894. 4894 _barna_runtime_defaults
  4895. 4895 if (%barna_addon == 1) _barna_autostart LOAD
  4896. 4896}
  4897. 4897
  4898. 4898alias barna.init {
  4899. 4899 _barna_autostart manual
  4900. 4900}
  4901. 4901
  4902. 4902alias barna.lagmode {
  4903. 4903 _barna_runtime_defaults
  4904. 4904
  4905. 4905 ; Modo canal grande: más cobertura que el modo conservador,
  4906. 4906 ; pero sin auditor JOIN, sin watchdog USERIP y sin reintentos lentos.
  4907. 4907 ; La clave anti-lag es no acumular rescates; solo acelerar el vaciado de USERIP.
  4908. 4908 set %barna_userip_q_delay 1
  4909. 4909 set %barna_userip_q_batch_max 2
  4910. 4910 set %barna_userip_q_batch_delay 1
  4911. 4911 set %barna_userip_turbo_threshold 10
  4912. 4912 set %barna_userip_turbo_batch_max 3
  4913. 4913 set %barna_userip_turbo_delay 1
  4914. 4914 set %barna_userip_emergency_threshold 30
  4915. 4915 set %barna_userip_emergency_batch_max 3
  4916. 4916 set %barna_userip_emergency_delay 1
  4917. 4917 set %barna_userip_q_max_pending 400
  4918. 4918 set %barna_userip_q_shed_to 0
  4919. 4919 set %barna_userip_no_shed 1
  4920. 4920
  4921. 4921 set %barna_userip_retry_backlog_limit 0
  4922. 4922 set %barna_userip_state_ttl 60
  4923. 4923 set %barna_userip_max_inflight 0
  4924. 4924 set %barna_userip_retry_max 0
  4925. 4925 set %barna_userip_retry_delay 12
  4926. 4926 set %barna_userip_retry_timer_mode 0
  4927. 4927 set %barna_userip_watchdog 0
  4928. 4928 set %barna_userip_watchdog_delay 20
  4929. 4929 set %barna_userip_watchdog_batch 0
  4930. 4930 set %barna_userip_watchdog_retry_max 0
  4931. 4931 set %barna_userip_slow_retry_max 0
  4932. 4932 set %barna_userip_slow_retry_delay 60
  4933. 4933
  4934. 4934 ; ASN limitado a 1 socket para evitar subida progresiva de lag.
  4935. 4935 set %barna_q_max_workers 1
  4936. 4936 set %barna_q_delay 3
  4937. 4937 set %barna_q_low_delay 30
  4938. 4938 set %barna_asn_pump_delay 1
  4939. 4939 set %barna_asn_turbo_threshold 5
  4940. 4940 set %barna_asn_turbo_workers 1
  4941. 4941 set %barna_q_max_retries 0
  4942. 4942 set %barna_sock_timeout_secs 6
  4943. 4943 set %barna_q_start_grace_secs 2
  4944. 4944 set %barna_q_ghost_grace_secs 0
  4945. 4945 set %barna_asn_cache_ttl 1800
  4946. 4946 set %barna_hygiene_secs 60
  4947. 4947 set %barna_asn_cache_max_exact 120
  4948. 4948 set %barna_q_var_max_idle 120
  4949. 4949 set %barna_q_var_max_active 120
  4950. 4950 set %barna_userip_var_max_idle 80
  4951. 4951 set %barna_saquit_var_max_idle 80
  4952. 4952
  4953. 4953 set %barna_debug 0
  4954. 4954 set %barna_debug_verbose 0
  4955. 4955 set %barna_debug_rx 0
  4956. 4956 set %barna_asn_echo_nonmatch 1
  4957. 4957 set %barna_echo_all_common_chans 1
  4958. 4958 set %barna_echo_queue 1
  4959. 4959 set %barna_echo_q_batch_max 6
  4960. 4960 set %barna_echo_q_delay 1
  4961. 4961 set %barna_echo_q_max 160
  4962. 4962
  4963. 4963 set %barna_join_audit 0
  4964. 4964 set %barna_join_audit_delay 60
  4965. 4965 set %barna_join_audit_batch 0
  4966. 4966 set %barna_join_audit_max_retries 0
  4967. 4967
  4968. 4968 set %barna_core_tick_delay 2
  4969. 4969 _barna_core_start
  4970. 4970 _barna_asn_pump_start_if_needed
  4971. 4971 _barna_core_ensure_timers
  4972. 4972 echo -s [ASN] Modo DIRECT107 aplicado: SAFEWHOIP + ECHOFAST + USERIP fallback + trace WHO directo + dedupe dinamico corregido. Avisos ASN locales: 6 cada 1s, cola max 160, sin tocar canales/ASN.
  4973. 4973}
  4974. 4974
  4975. 4975
  4976. 4976
  4977. 4977alias barna.suave {
  4978. 4978 barna.lagmode
  4979. 4979}
  4980. 4980
  4981. 4981
  4982. 4982alias barna.canalgrande {
  4983. 4983 barna.lagmode
  4984. 4984 barna.highflow silent
  4985. 4985}
  4986. 4986
  4987. 4987alias barna.highflow {
  4988. 4988 _barna_runtime_defaults
  4989. 4989 set %barna_highflow_gc 1
  4990. 4990 set %barna_heavy_gc_secs 8
  4991. 4991 set %barna_sockvar_gc_secs 5
  4992. 4992 set %barna_total_max_vars 900
  4993. 4993 set %barna_lookup_max_vars 100
  4994. 4994 set %barna_lastip_max_vars 120
  4995. 4995 set %barna_lookup_total_max_vars 250
  4996. 4996 set %barna_lookup_idle_total_max 200
  4997. 4997 set %barna_sockvar_max_vars 25
  4998. 4998 set %barna_seen_max_vars 220
  4999. 4999 set %barna_echo_seen_max_vars 60
  5000. 5000 set %barna_echo_asn_seen_max_vars 120
  5001. 5001 set %barna_badnick_max_vars 90
  5002. 5002 set %barna_badpfx2_max_vars 12
  5003. 5003 set %barna_badpfx3_max_vars 25
  5004. 5004 set %barna_ip_keep_ttl 600
  5005. 5005 set %barna_ip_keep_max_vars 80
  5006. 5006 set %barna_userip_var_max_idle 50
  5007. 5007 set %barna_q_var_max_idle 60
  5008. 5008 set %barna_q_var_max_active 80
  5009. 5009 if ($1 != silent) echo -s [ASN] HIGHFLOW_GC activado: GC 8s, sockGC 5s, total max 900, limpieza agresiva de temporales sin tocar canales/ASN.
  5010. 5010}
  5011. 5011
  5012. 5012alias barna.highflowoff {
  5013. 5013 set %barna_highflow_gc 0
  5014. 5014 echo -s [ASN] HIGHFLOW_GC desactivado. Los limites actuales no se restauran automaticamente; usa /barna.lagmode si quieres volver a modo equilibrado.
  5015. 5015}
  5016. 5016
  5017. 5017
  5018. 5018; ------------------------------------------------------------
  5019. 5019; BLOQUE 4.9
  5020. 5020; TRAZA Y RECHECK LIGERO POR NICK
  5021. 5021; ------------------------------------------------------------
  5022. 5022
  5023. 5023alias _barna_trace_refresh_seen {
  5024. 5024 if ($1 == $null) return
  5025. 5025
  5026. 5026 var %nick = $1
  5027. 5027 var %i = 1
  5028. 5028
  5029. 5029 while (%i <= $comchan(%nick,0)) {
  5030. 5030 var %c = $comchan(%nick,%i)
  5031. 5031
  5032. 5032 if ($_barna_is_chan_enabled(%c)) {
  5033. 5033 _barna_seen_add %nick %c
  5034. 5034 }
  5035. 5035
  5036. 5036 inc %i
  5037. 5037 }
  5038. 5038}
  5039. 5039
  5040. 5040
  5041. 5041alias -l _barna_userip_q_has_item {
  5042. 5042 if ($1 == $null) return 0
  5043. 5043
  5044. 5044 var %ln = $lower($1)
  5045. 5045 var %head = %barna_userip_q_head
  5046. 5046 var %tail = %barna_userip_q_tail
  5047. 5047
  5048. 5048 if (%head !isnum 1-) return 0
  5049. 5049 if (%tail !isnum 1-) return 0
  5050. 5050 if (%head > %tail) return 0
  5051. 5051
  5052. 5052 var %guard = 0
  5053. 5053
  5054. 5054 while ((%head <= %tail) && (%guard < 500)) {
  5055. 5055 var %n = [ [ $+(%,barna_userip_q_item.,%head) ] ]
  5056. 5056
  5057. 5057 if (($lower(%n) == %ln) && (%n != $null)) return 1
  5058. 5058
  5059. 5059 inc %head
  5060. 5060 inc %guard
  5061. 5061 }
  5062. 5062
  5063. 5063 return 0
  5064. 5064}
  5065. 5065
  5066. 5066alias -l _barna_whoip_has_real_work {
  5067. 5067 if ($1 == $null) return 0
  5068. 5068
  5069. 5069 var %nick = $1
  5070. 5070 var %ln = $lower(%nick)
  5071. 5071
  5072. 5072 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) return 1
  5073. 5073 if (%barna_whoip_current_ln == %ln) return 1
  5074. 5074
  5075. 5075 if ([ [ $+(%,barna_userip_q_pending.,%ln) ] ] == 1) {
  5076. 5076 if ($_barna_userip_q_has_item(%nick)) return 1
  5077. 5077
  5078. 5078 ; Build 105:
  5079. 5079 ; q_pending sin item FIFO ni inflight es un fantasma. No debe bloquear rescates.
  5080. 5080 unset %barna_userip_q_pending. $+ %ln
  5081. 5081 unset %barna_userip_q_chans. $+ %ln
  5082. 5082 unset %barna_userip_sent_recent. $+ %ln
  5083. 5083 }
  5084. 5084
  5085. 5085 return 0
  5086. 5086}
  5087. 5087
  5088. 5088alias _barna_trace_queue_find {
  5089. 5089 if ($1 == $null) return
  5090. 5090
  5091. 5091 var %ln = $lower($1)
  5092. 5092 var %id = [ [ $+(%,barna_q_pending.,%ln) ] ]
  5093. 5093
  5094. 5094 if (%id != $null) return %id
  5095. 5095
  5096. 5096 var %ida = [ [ $+(%,barna_q_active.,%ln) ] ]
  5097. 5097 if (%ida != $null) return %ida
  5098. 5098
  5099. 5099 var %i = 1
  5100. 5100
  5101. 5101 while (%i <= $numtok(%barna_q_items,44)) {
  5102. 5102 var %qid = $gettok(%barna_q_items,%i,44)
  5103. 5103 var %qn = [ [ $+(%,barna_q_nick.,%qid) ] ]
  5104. 5104
  5105. 5105 if ($lower(%qn) == %ln) return %qid
  5106. 5106
  5107. 5107 inc %i
  5108. 5108 }
  5109. 5109
  5110. 5110 var %j = 1
  5111. 5111
  5112. 5112 while (%j <= $numtok(%barna_q_low_items,44)) {
  5113. 5113 var %qid2 = $gettok(%barna_q_low_items,%j,44)
  5114. 5114 var %qn2 = [ [ $+(%,barna_q_nick.,%qid2) ] ]
  5115. 5115
  5116. 5116 if ($lower(%qn2) == %ln) return %qid2
  5117. 5117
  5118. 5118 inc %j
  5119. 5119 }
  5120. 5120}
  5121. 5121
  5122. 5122; ------------------------------------------------------------
  5123. 5123; BLOQUE 5.9.1
  5124. 5124; IPKEEP: cache ligera de IP por nick para debug y Parseline2
  5125. 5125; ------------------------------------------------------------
  5126. 5126
  5127. 5127alias _barna_ip_store {
  5128. 5128 if ($1 == $null) return
  5129. 5129 if ($2 == $null) return
  5130. 5130
  5131. 5131 var %nick = $1
  5132. 5132 var %ip = $2
  5133. 5133 var %ln = $lower(%nick)
  5134. 5134
  5135. 5135 if (!$_barna_is_ipv4(%ip)) return
  5136. 5136
  5137. 5137 ; last_ip sigue siendo cache temporal corta usada por lookup normal.
  5138. 5138 set -u45 %barna_last_ip. $+ %ln %ip
  5139. 5139 set -u45 %barna_last_ip_ts. $+ %ln $ctime
  5140. 5140
  5141. 5141 ; ip_keep sobrevive a LOOKCLEAN/LAGCLEAN para que Parseline2 y /barna.trace
  5142. 5142 ; puedan mostrar IP aunque se limpien variables temporales de lookup.
  5143. 5143 set -u90 %barna_ip_keep. $+ %ln %ip
  5144. 5144}
  5145. 5145
  5146. 5146alias _barna_ip_get {
  5147. 5147 if ($1 == $null) return
  5148. 5148
  5149. 5149 var %nick = $1
  5150. 5150 var %ln = $lower(%nick)
  5151. 5151 var %ip
  5152. 5152
  5153. 5153 %ip = [ [ $+(%,barna_last_ip.,%ln) ] ]
  5154. 5154 if (%ip != $null) return %ip
  5155. 5155
  5156. 5156 %ip = [ [ $+(%,barna_ip_keep.,%ln) ] ]
  5157. 5157 if (%ip != $null) return %ip
  5158. 5158
  5159. 5159 %ip = [ [ $+(%,barna_saquit_ip.,%ln) ] ]
  5160. 5160 if (%ip != $null) return %ip
  5161. 5161
  5162. 5162 %ip = [ [ $+(%,barna_badnick_ip.,%ln) ] ]
  5163. 5163 if (%ip != $null) return %ip
  5164. 5164}
  5165. 5165
  5166. 5166; Build 80: IP fresca de lookup/WHOIP.
  5167. 5167; Solo usa %barna_last_ip.* reciente, no ip_keep, para evitar IP antigua.
  5168. 5168alias _barna_ip_get_fresh_lookup {
  5169. 5169 if ($1 == $null) return
  5170. 5170
  5171. 5171 var %nick = $1
  5172. 5172 var %ln = $lower(%nick)
  5173. 5173 var %ip = [ [ $+(%,barna_last_ip.,%ln) ] ]
  5174. 5174
  5175. 5175 if (%ip == $null) return
  5176. 5176 if (!$_barna_is_ipv4(%ip)) return
  5177. 5177
  5178. 5178 var %ts = [ [ $+(%,barna_last_ip_ts.,%ln) ] ]
  5179. 5179 if (%ts isnum 1-) {
  5180. 5180 var %age = $calc($ctime - %ts)
  5181. 5181 if (%age > 120) return
  5182. 5182 }
  5183. 5183
  5184. 5184 return %ip
  5185. 5185}
  5186. 5186
  5187. 5187; Build 80: si ya hay IP fresca pero no cache ASN, no esperar a SEENGUARD.
  5188. 5188; Lanza ASN directa y limpia el estado WHOIP/lookup.
  5189. 5189alias _barna_fast_asn_if_ip_ready {
  5190. 5190 if ($1 == $null) return 0
  5191. 5191
  5192. 5192 var %nick = $1
  5193. 5193 var %reason = $2-
  5194. 5194 var %ln = $lower(%nick)
  5195. 5195 var %ip = $_barna_ip_get_fresh_lookup(%nick)
  5196. 5196
  5197. 5197 if ($_barna_is_privileged_nick(%nick)) {
  5198. 5198 _barna_dbg PRIVSAFE FASTASN omite nick con @/+v: nick= %nick reason= %reason
  5199. 5199 _barna_privileged_cleanup_nick %nick FASTASN
  5200. 5200 return 1
  5201. 5201 }
  5202. 5202
  5203. 5203 if (%ip == $null) return 0
  5204. 5204
  5205. 5205 var %chans = $_barna_nick_enabled_chans(%nick)
  5206. 5206 if (%chans == $null) var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  5207. 5207 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  5208. 5208
  5209. 5209 if (%chans == $null) return 0
  5210. 5210
  5211. 5211 var %key = $_barna_asn_cache_key(%ip)
  5212. 5212
  5213. 5213 ; Build 83:
  5214. 5214 ; Si ya existe cache ASN/ISP para esta IP, no esperamos a RAW354/SEENGUARD
  5215. 5215 ; ni reencolamos ASN. Aplicamos cache, emitimos aviso y limpiamos lookup/qry.
  5216. 5216 if ($_barna_asn_cache_key_valid(%key)) {
  5217. 5217 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  5218. 5218 _barna_dbg FASTCACHE cache ASN aplicada inmediata: nick= %nick ip= %ip chans= %chans reason= %reason
  5219. 5219
  5220. 5220 unset %barna_lookup. $+ %ln
  5221. 5221 unset %barna_lookup_chans. $+ %ln
  5222. 5222 unset %barna_qry. $+ %ln
  5223. 5223 unset %barna_ipdone. $+ %ln
  5224. 5224 unset %barna_userip_sent_recent. $+ %ln
  5225. 5225 unset %barna_userip_retry. $+ %ln
  5226. 5226 unset %barna_userip_sent_ts. $+ %ln
  5227. 5227 unset %barna_userip_watchtry. $+ %ln
  5228. 5228
  5229. 5229 _barna_userip_q_release %nick FASTCACHE_HIT
  5230. 5230 return 1
  5231. 5231 }
  5232. 5232
  5233. 5233 return 0
  5234. 5234 }
  5235. 5235
  5236. 5236 if ([ [ $+(%,barna_q_active.,%ln) ] ] != $null) return 0
  5237. 5237 if ([ [ $+(%,barna_q_pending.,%ln) ] ] != $null) return 0
  5238. 5238
  5239. 5239 _barna_dbg FASTASN IP fresca sin cache, lanzo ASN directa: nick= %nick ip= %ip chans= %chans reason= %reason
  5240. 5240
  5241. 5241 unset %barna_lookup. $+ %ln
  5242. 5242 unset %barna_qry. $+ %ln
  5243. 5243 unset %barna_ipdone. $+ %ln
  5244. 5244 unset %barna_userip_sent_recent. $+ %ln
  5245. 5245
  5246. 5246 _barna_userip_q_release %nick FASTASN_IP_READY
  5247. 5247 _barna_q_clear_ghost_light
  5248. 5248 _barna_q_add %nick %ip %chans
  5249. 5249 _barna_q_process
  5250. 5250 _barna_asn_pump_start_if_needed
  5251. 5251
  5252. 5252 return 1
  5253. 5253}
  5254. 5254
  5255. 5255alias _barna_ipkeep_gc_tick {
  5256. 5256 ; Build 53: GC especifico de ip_keep.
  5257. 5257 ; ip_keep es util para Parseline2/trace, pero en canales grandes puede crecer muy rapido.
  5258. 5258 if (%barna_addon != 1) return 0
  5259. 5259 if (%barna_ipkeep_gc_busy == 1) return 0
  5260. 5260
  5261. 5261 var %now = $ctime
  5262. 5262 if (%barna_ipkeep_gc_last != $null) {
  5263. 5263 if ($calc(%now - %barna_ipkeep_gc_last) < 10) return 0
  5264. 5264 }
  5265. 5265
  5266. 5266 set -u10 %barna_ipkeep_gc_busy 1
  5267. 5267 set %barna_ipkeep_gc_last %now
  5268. 5268
  5269. 5269 var %n = $var(%barna_ip_keep.*,0)
  5270. 5270 var %max = %barna_ip_keep_max_vars
  5271. 5271 if (%max !isnum 100-) var %max = 700
  5272. 5272 if (%max > 700) var %max = 700
  5273. 5273
  5274. 5274 if (%n > %max) {
  5275. 5275 unset %barna_ip_keep.*
  5276. 5276 _barna_dbg IPKEEPGC limpiado por limite: ip_keep= %n max= %max
  5277. 5277 }
  5278. 5278
  5279. 5279 unset %barna_ipkeep_gc_busy
  5280. 5280 return 0
  5281. 5281}
  5282. 5282
  5283. 5283alias barna.ipkeepclean {
  5284. 5284 unset %barna_ip_keep.*
  5285. 5285 echo -s [ASN] IPKEEPCLEAN ejecutado. Limpieza de IP persistente ligera sin tocar canales/ASN.
  5286. 5286}
  5287. 5287
  5288. 5288
  5289. 5289; ------------------------------------------------------------
  5290. 5290; BLOQUE 5.9.2
  5291. 5291; TRACE/FORCEWHOIP: rescate manual inmediato de nicks sin IP
  5292. 5292; ------------------------------------------------------------
  5293. 5293
  5294. 5294alias -l _barna_trace_force_whoip {
  5295. 5295 if ($1 == $null) return 0
  5296. 5296
  5297. 5297 var %nick = $1
  5298. 5298 var %ln = $lower(%nick)
  5299. 5299 var %chans = $2-
  5300. 5300 var %ttl = $_barna_userip_ttl
  5301. 5301
  5302. 5302 if ($_barna_is_join_exception(%nick)) {
  5303. 5303 _barna_dbg EXCEPTIONSAFE TRACE/FORCEWHOIP omite nick exceptuado: nick= %nick
  5304. 5304 _barna_exception_cleanup_nick %nick
  5305. 5305 return 0
  5306. 5306 }
  5307. 5307
  5308. 5308 if ($_barna_is_privileged_nick(%nick)) {
  5309. 5309 _barna_dbg PRIVSAFE TRACE/FORCEWHOIP omite nick con @/+v: nick= %nick
  5310. 5310 _barna_privileged_cleanup_nick %nick TRACE_FORCEWHOIP
  5311. 5311 return 0
  5312. 5312 }
  5313. 5313
  5314. 5314 if (%ttl !isnum 30-) var %ttl = 90
  5315. 5315 if (%chans == $null) var %chans = $_barna_nick_enabled_chans(%nick)
  5316. 5316 if (%chans == $null) return 0
  5317. 5317
  5318. 5318 ; Build 107:
  5319. 5319 ; /barna.trace es una orden manual de rescate. El fallo observado en hpdk/agus14chileno
  5320. 5320 ; era que lookup/qry/pending quedaban vivos pero no existia slot, qid, socket ni IP.
  5321. 5321 ; Si reencolamos por FIFO, algunos nicks vuelven a quedar en pending fantasma.
  5322. 5322 ; Por eso este rescate NO usa la cola: limpia estado ligero y lanza WHO directo,
  5323. 5323 ; creando inflight/current reales para que RAW354 o RAW315 cierren el ciclo.
  5324. 5324 _barna_userip_q_release %nick TRACE_FORCE_DIRECTWHO_RESET
  5325. 5325 unset %barna_userip_q_pending. $+ %ln
  5326. 5326 unset %barna_userip_q_chans. $+ %ln
  5327. 5327 unset %barna_userip_q_slot. $+ %ln
  5328. 5328 unset %barna_userip_sent_recent. $+ %ln
  5329. 5329 unset %barna_userip_stuck_rescue_recent. $+ %ln
  5330. 5330 unset %barna_seen_rescue_recent. $+ %ln
  5331. 5331 unset %barna_ipdone. $+ %ln
  5332. 5332 unset %barna_userip_inflight. $+ %ln
  5333. 5333 unset %barna_lookup. $+ %ln
  5334. 5334 unset %barna_lookup_chans. $+ %ln
  5335. 5335 unset %barna_qry. $+ %ln
  5336. 5336
  5337. 5337 unset %barna_whoip_current_nick
  5338. 5338 unset %barna_whoip_current_ln
  5339. 5339 unset %barna_whoip_315_done_pending
  5340. 5340
  5341. 5341 set $+(-u,%ttl) %barna_lookup. $+ %ln 1
  5342. 5342 set $+(-u,%ttl) %barna_lookup_chans. $+ %ln %chans
  5343. 5343 set $+(-u,%ttl) %barna_qry. $+ %ln 1
  5344. 5344 set -u15 %barna_userip_sent_recent. $+ %ln 1
  5345. 5345 set $+(-u,%ttl) %barna_whoip_current_nick %nick
  5346. 5346 set $+(-u,%ttl) %barna_whoip_current_ln %ln
  5347. 5347 set $+(-u,%ttl) %barna_userip_inflight. $+ %ln 1
  5348. 5348 set $+(-u,%ttl) %barna_whoip_sent. $+ %ln 1
  5349. 5349 noop $_barna_whoip_315_inc
  5350. 5350 _barna_userip_inflight_inc
  5351. 5351
  5352. 5352 _barna_dbg TRACE FORCEWHOIP WHO directo: nick= %nick chans= %chans
  5353. 5353 .raw -q WHO %nick $+(n,$chr(37),ni)
  5354. 5354
  5355. 5355 ; Build 109: watchdog corto del WHO directo. Si no llega RAW354/IP a los 8s,
  5356. 5356 ; el propio WHO directo se considera stale aunque current/inflight sigan vivos.
  5357. 5357 ; Asi se fuerza USERIP fallback y/o se limpia lookup/qry fantasma.
  5358. 5358 var %hk = $md5(%ln,0)
  5359. 5359 var %tw = BarnaTraceWHOChk_ $+ %hk
  5360. 5360 .timer $+ %tw 1 8 _barna_trace_directwho_check %nick
  5361. 5361
  5362. 5362 _barna_core_start
  5363. 5363
  5364. 5364 return 1
  5365. 5365}
  5366. 5366
  5367. 5367alias -l _barna_trace_directwho_check {
  5368. 5368 if ($1 == $null) return 0
  5369. 5369
  5370. 5370 var %nick = $1
  5371. 5371 var %ln = $lower(%nick)
  5372. 5372 var %chans = $_barna_nick_enabled_chans(%nick)
  5373. 5373
  5374. 5374 if ($_barna_is_privileged_nick(%nick)) {
  5375. 5375 _barna_dbg PRIVSAFE TRACE DIRECTWHO CHECK cancela por @/+v: nick= %nick
  5376. 5376 _barna_privileged_cleanup_nick %nick TRACE_DIRECTWHO_CHECK
  5377. 5377 return 0
  5378. 5378 }
  5379. 5379
  5380. 5380 ; Si el nick ya no esta online en canales activos, limpiar estado fantasma.
  5381. 5381 if (%chans == $null) {
  5382. 5382 _barna_dbg TRACE DIRECTWHO CHECK limpia offline: nick= %nick
  5383. 5383 _barna_userip_q_release %nick TRACE_DIRECTWHO_CHECK_OFFLINE
  5384. 5384 unset %barna_lookup. $+ %ln
  5385. 5385 unset %barna_lookup_chans. $+ %ln
  5386. 5386 unset %barna_qry. $+ %ln
  5387. 5387 unset %barna_ipdone. $+ %ln
  5388. 5388 unset %barna_userip_sent_recent. $+ %ln
  5389. 5389 unset %barna_userip_fallback_recent. $+ %ln
  5390. 5390 return 0
  5391. 5391 }
  5392. 5392
  5393. 5393 ; Si ya tenemos IP fresca, empujar ASN/cache y cerrar lookup/qry.
  5394. 5394 if ($_barna_fast_asn_if_ip_ready(%nick,TRACE_DIRECTWHO_CHECK_IP_READY)) return 1
  5395. 5395
  5396. 5396 var %ip = $_barna_ip_get(%nick)
  5397. 5397 if (%ip != $null) {
  5398. 5398 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  5399. 5399 _barna_dbg TRACE DIRECTWHO CHECK aplica cache por IP conservada: nick= %nick ip= %ip chans= %chans
  5400. 5400 _barna_userip_q_release %nick TRACE_DIRECTWHO_CHECK_CACHE
  5401. 5401 unset %barna_lookup. $+ %ln
  5402. 5402 unset %barna_lookup_chans. $+ %ln
  5403. 5403 unset %barna_qry. $+ %ln
  5404. 5404 unset %barna_ipdone. $+ %ln
  5405. 5405 unset %barna_userip_sent_recent. $+ %ln
  5406. 5406 return 1
  5407. 5407 }
  5408. 5408
  5409. 5409 if ($_barna_trace_queue_find(%nick) == $null) {
  5410. 5410 _barna_dbg TRACE DIRECTWHO CHECK envia IP a ASN: nick= %nick ip= %ip chans= %chans
  5411. 5411 _barna_userip_q_release %nick TRACE_DIRECTWHO_CHECK_IP_TO_ASN
  5412. 5412 unset %barna_lookup. $+ %ln
  5413. 5413 unset %barna_qry. $+ %ln
  5414. 5414 unset %barna_ipdone. $+ %ln
  5415. 5415 unset %barna_userip_sent_recent. $+ %ln
  5416. 5416 _barna_q_add %nick %ip %chans
  5417. 5417 _barna_q_process
  5418. 5418 _barna_asn_pump_start_if_needed
  5419. 5419 return 1
  5420. 5420 }
  5421. 5421 }
  5422. 5422
  5423. 5423 var %inflight = [ [ $+(%,barna_userip_inflight.,%ln) ] ]
  5424. 5424 var %hascurrent = 0
  5425. 5425 if (%barna_whoip_current_ln == %ln) var %hascurrent = 1
  5426. 5426 var %qid = $_barna_trace_queue_find(%nick)
  5427. 5427
  5428. 5428 ; Build 109:
  5429. 5429 ; Este check pertenece exclusivamente al WHO directo lanzado por /barna.trace.
  5430. 5430 ; Si a los 8s no hay IP ni qid ASN, ese WHO se considera stale aunque todavia
  5431. 5431 ; sigan vivos current/inflight. En builds anteriores eso mantenia lookup/qry=1
  5432. 5432 ; sin qid/socket/IP durante varios traces.
  5433. 5433 if (%qid == $null) {
  5434. 5434 _barna_dbg TRACE DIRECTWHO CHECK stale sin IP: nick= %nick chans= %chans inflight= %inflight current= %hascurrent
  5435. 5435 _barna_userip_q_release %nick TRACE_DIRECTWHO_CHECK_STALE_DIRECTWHO
  5436. 5436 unset %barna_whoip_current_nick
  5437. 5437 unset %barna_whoip_current_ln
  5438. 5438 unset %barna_whoip_315_done_pending
  5439. 5439
  5440. 5440 if ([ [ $+(%,barna_userip_fallback_recent.,%ln) ] ] != 1) {
  5441. 5441 if ($_barna_userip_fallback_send(%nick,TRACE_DIRECTWHO_CHECK_STALE_NO_RAW354)) {
  5442. 5442 var %hk2 = $md5(%ln,0)
  5443. 5443 var %tw2 = BarnaTraceWHOChk_ $+ %hk2
  5444. 5444 .timer $+ %tw2 1 10 _barna_trace_directwho_check %nick
  5445. 5445 return 1
  5446. 5446 }
  5447. 5447 }
  5448. 5448
  5449. 5449 _barna_dbg TRACE DIRECTWHO CHECK limpia fantasma sin IP tras fallback: nick= %nick chans= %chans
  5450. 5450 _barna_userip_q_release %nick TRACE_DIRECTWHO_CHECK_STUCK_CLEAN
  5451. 5451 unset %barna_lookup. $+ %ln
  5452. 5452 unset %barna_lookup_chans. $+ %ln
  5453. 5453 unset %barna_qry. $+ %ln
  5454. 5454 unset %barna_ipdone. $+ %ln
  5455. 5455 unset %barna_userip_sent_recent. $+ %ln
  5456. 5456 unset %barna_seen_rescue_recent. $+ %ln
  5457. 5457 unset %barna_userip_fallback_recent. $+ %ln
  5458. 5458 return 0
  5459. 5459 }
  5460. 5460
  5461. 5461 return 0
  5462. 5462}
  5463. 5463
  5464. 5464alias barna.trace {
  5465. 5465 _barna_runtime_defaults
  5466. 5466
  5467. 5467 if ($1 == $null) {
  5468. 5468 echo -a $chr(3) $+ 4 $+ [ASN] $chr(15) Uso: /barna.trace <nick>
  5469. 5469 return
  5470. 5470 }
  5471. 5471
  5472. 5472 var %nick = $1
  5473. 5473 var %ln = $lower(%nick)
  5474. 5474
  5475. 5475 if ($_barna_is_join_exception(%nick)) {
  5476. 5476 _barna_exception_cleanup_nick %nick
  5477. 5477 echo -a $timestamp $chr(3) $+ 12 $+ [ASN-TRACE] $chr(15) nick= %nick estado= EXCEPCION_ONJOIN_NO_SCAN_NO_SANCION
  5478. 5478 halt
  5479. 5479 }
  5480. 5480
  5481. 5481 _barna_trace_refresh_seen %nick
  5482. 5482
  5483. 5483 var %seen = $_barna_seen_get(%nick)
  5484. 5484 var %lookup = [ [ $+(%,barna_lookup.,%ln) ] ]
  5485. 5485 var %lookupchans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  5486. 5486 var %qry = [ [ $+(%,barna_qry.,%ln) ] ]
  5487. 5487 var %uqslot = [ [ $+(%,barna_userip_q_slot.,%ln) ] ]
  5488. 5488 var %uqpend = [ [ $+(%,barna_userip_q_pending.,%ln) ] ]
  5489. 5489 var %sent = [ [ $+(%,barna_userip_sent_recent.,%ln) ] ]
  5490. 5490 var %lastip = $_barna_ip_get(%nick)
  5491. 5491 var %ipdone = [ [ $+(%,barna_ipdone.,%ln) ] ]
  5492. 5492 var %qid = $_barna_trace_queue_find(%nick)
  5493. 5493 var %qstate = ninguno
  5494. 5494 var %qip = $null
  5495. 5495 var %qchans = $null
  5496. 5496 var %qtry = $null
  5497. 5497 var %qage = $null
  5498. 5498 var %cacheasn = $null
  5499. 5499 var %cachename = $null
  5500. 5500 var %status = sin_estado
  5501. 5501
  5502. 5502 if (%lookup == $null) var %lookup = 0
  5503. 5503 if (%qry == $null) var %qry = 0
  5504. 5504 if (%uqslot == $null) var %uqslot = no
  5505. 5505 if (%uqpend == $null) var %uqpend = no
  5506. 5506 if (%sent == $null) var %sent = no
  5507. 5507 if (%ipdone == $null) var %ipdone = 0
  5508. 5508 if (%seen == $null) var %seen = ninguno
  5509. 5509 if (%lookupchans == $null) var %lookupchans = ninguno
  5510. 5510 if (%lastip == $null) var %lastip = ninguna
  5511. 5511
  5512. 5512 if (%qid != $null) {
  5513. 5513 var %qactive = [ [ $+(%,barna_q_active.,%ln) ] ]
  5514. 5514 var %qpending = [ [ $+(%,barna_q_pending.,%ln) ] ]
  5515. 5515
  5516. 5516 if (%qactive == %qid) var %qstate = activa
  5517. 5517 elseif (%qpending == %qid) var %qstate = pendiente
  5518. 5518 else var %qstate = en_lista
  5519. 5519
  5520. 5520 if ([ [ $+(%,barna_q_low.,%qid) ] ] == 1) var %qstate = %qstate $+ /baja
  5521. 5521 else var %qstate = %qstate $+ /normal
  5522. 5522
  5523. 5523 var %qip = [ [ $+(%,barna_q_ip.,%qid) ] ]
  5524. 5524 var %qchans = [ [ $+(%,barna_q_chans.,%qid) ] ]
  5525. 5525 var %qtry = [ [ $+(%,barna_q_try.,%qid) ] ]
  5526. 5526 var %qts = [ [ $+(%,barna_q_ts.,%qid) ] ]
  5527. 5527
  5528. 5528 if (%qip == $null) var %qip = sin_ip
  5529. 5529 if (%qchans == $null) var %qchans = sin_canales
  5530. 5530 if (%qtry == $null) var %qtry = 0
  5531. 5531 if (%qts != $null) var %qage = $calc($ctime - %qts) $+ s
  5532. 5532 else var %qage = sin_ts
  5533. 5533 }
  5534. 5534
  5535. 5535 if (%lastip != ninguna) {
  5536. 5536 var %key = $_barna_asn_cache_key(%lastip)
  5537. 5537 var %cacheasn = [ [ $+(%,barna_asn_cache_asn.,%key) ] ]
  5538. 5538 var %cachename = [ [ $+(%,barna_asn_cache_name.,%key) ] ]
  5539. 5539 }
  5540. 5540
  5541. 5541 if (!$_barna_asn_cache_val_ok(%cacheasn)) var %cacheasn = no
  5542. 5542 if (!$_barna_asn_cache_val_ok(%cachename)) var %cachename = no
  5543. 5543
  5544. 5544 ; Build 96:
  5545. 5545 ; Si el trace detecta cola ASN pendiente pero la cache ASN/ISP ya existe,
  5546. 5546 ; aplica cache, emite aviso/sancion y elimina esa cola fantasma.
  5547. 5547 if ((%cacheasn != no) && (%lastip != ninguna) && (%qid != $null)) {
  5548. 5548 if ($_barna_q_fastcache_apply(%qid,TRACE_QFASTCACHE)) {
  5549. 5549 unset %barna_lookup. $+ %ln
  5550. 5550 unset %barna_lookup_chans. $+ %ln
  5551. 5551 unset %barna_qry. $+ %ln
  5552. 5552 unset %barna_ipdone. $+ %ln
  5553. 5553 unset %barna_userip_sent_recent. $+ %ln
  5554. 5554 _barna_userip_q_release %nick TRACE_QFASTCACHE
  5555. 5555 var %lookup = 0
  5556. 5556 var %qry = 0
  5557. 5557 var %ipdone = 0
  5558. 5558 var %lookupchans = ninguno
  5559. 5559 var %qid = $null
  5560. 5560 var %qstate = ninguno
  5561. 5561 var %qip = $null
  5562. 5562 var %qchans = $null
  5563. 5563 var %qtry = $null
  5564. 5564 var %qage = $null
  5565. 5565 var %status = cache_ASN_aplicada_QFASTCACHE
  5566. 5566 }
  5567. 5567 }
  5568. 5568
  5569. 5569 ; Build 83:
  5570. 5570 ; Si el trace detecta IP + cache ASN pero quedan lookup/qry vivos,
  5571. 5571 ; aplica cache y limpia el estado pendiente. /barna.trace ya actua como
  5572. 5572 ; herramienta de rescate en otros casos, asi que mantenemos esa filosofia.
  5573. 5573 if ((%cacheasn != no) && (%lastip != ninguna) && (%lookup == 1) && (%qid == $null)) {
  5574. 5574 var %trace_chans_fastcache = %lookupchans
  5575. 5575 if (%trace_chans_fastcache == ninguno) var %trace_chans_fastcache = $_barna_seen_get(%nick)
  5576. 5576 if (%trace_chans_fastcache == $null) var %trace_chans_fastcache = $_barna_nick_enabled_chans(%nick)
  5577. 5577
  5578. 5578 if (%trace_chans_fastcache != $null) {
  5579. 5579 if ($_barna_asn_cache_apply(%nick,%lastip,%trace_chans_fastcache)) {
  5580. 5580 unset %barna_lookup. $+ %ln
  5581. 5581 unset %barna_lookup_chans. $+ %ln
  5582. 5582 unset %barna_qry. $+ %ln
  5583. 5583 unset %barna_ipdone. $+ %ln
  5584. 5584 unset %barna_userip_sent_recent. $+ %ln
  5585. 5585 _barna_userip_q_release %nick TRACE_FASTCACHE
  5586. 5586 var %lookup = 0
  5587. 5587 var %qry = 0
  5588. 5588 var %ipdone = 0
  5589. 5589 var %lookupchans = ninguno
  5590. 5590 var %status = cache_ASN_aplicada_FASTCACHE
  5591. 5591 }
  5592. 5592 }
  5593. 5593 }
  5594. 5594
  5595. 5595 if ((%status != cache_ASN_aplicada_FASTCACHE) && (%status != cache_ASN_aplicada_QFASTCACHE)) {
  5596. 5596 if (%qid != $null) var %status = esperando_ASN
  5597. 5597 elseif (%uqslot != no) var %status = esperando_WHOIP_en_cola
  5598. 5598 elseif (%lookup == 1) var %status = WHOIP_enviado_o_esperando_RAW354
  5599. 5599 elseif (%cacheasn != no) var %status = cache_ASN_disponible
  5600. 5600 elseif (%seen != ninguno) var %status = visto_sin_consulta_activa
  5601. 5601 }
  5602. 5602
  5603. 5603 ; Build 60: si el trace detecta exactamente el estado problematico y el nick sigue online,
  5604. 5604 ; dispara un rescate manual seguro. Esto ayuda a confirmar/reparar casos reales en vivo.
  5605. 5605 if (%status == visto_sin_consulta_activa) {
  5606. 5606 var %livechans_trace = $_barna_nick_enabled_chans(%nick)
  5607. 5607 if (%livechans_trace != $null) {
  5608. 5608 if (!$_barna_seen_rescue_has_result(%nick)) {
  5609. 5609 if (!$_barna_nick_has_lookup_work(%nick)) {
  5610. 5610 set -u120 %barna_seen_rescue_recent. $+ %ln 1
  5611. 5611 var %trace_ip = $_barna_ip_get(%nick)
  5612. 5612
  5613. 5613 if (%trace_ip != $null) {
  5614. 5614 _barna_q_add %nick %trace_ip %livechans_trace
  5615. 5615 var %status = visto_sin_consulta_activa_RESCATADO_ASN
  5616. 5616 }
  5617. 5617 else {
  5618. 5618 if ($_barna_trace_force_whoip(%nick,%livechans_trace)) {
  5619. 5619 var %status = visto_sin_consulta_activa_RESCATADO_WHOIP
  5620. 5620 var %lookup = [ [ $+(%,barna_lookup.,%ln) ] ]
  5621. 5621 var %lookupchans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  5622. 5622 var %qry = [ [ $+(%,barna_qry.,%ln) ] ]
  5623. 5623 var %uqslot = [ [ $+(%,barna_userip_q_slot.,%ln) ] ]
  5624. 5624 var %uqpend = [ [ $+(%,barna_userip_q_pending.,%ln) ] ]
  5625. 5625 var %sent = [ [ $+(%,barna_userip_sent_recent.,%ln) ] ]
  5626. 5626 if (%lookup == $null) var %lookup = 0
  5627. 5627 if (%lookupchans == $null) var %lookupchans = ninguno
  5628. 5628 if (%qry == $null) var %qry = 0
  5629. 5629 if (%uqslot == $null) var %uqslot = no
  5630. 5630 if (%uqpend == $null) var %uqpend = no
  5631. 5631 if (%sent == $null) var %sent = no
  5632. 5632 }
  5633. 5633 }
  5634. 5634 }
  5635. 5635 }
  5636. 5636 }
  5637. 5637 }
  5638. 5638
  5639. 5639 ; Build 106:
  5640. 5640 ; Si /barna.trace detecta lookup/qry vivos sin IP pero sin trabajo real
  5641. 5641 ; (sin inflight/current, sin qid, sin socket y sin IP), fuerza rescate aunque haya
  5642. 5642 ; q_pending/sent_recent fantasma o un q_item viejo que ya no tiene consulta viva.
  5643. 5643 if (%status == WHOIP_enviado_o_esperando_RAW354) {
  5644. 5644 var %trace_inflight = [ [ $+(%,barna_userip_inflight.,%ln) ] ]
  5645. 5645 var %trace_has_current = 0
  5646. 5646 if (%barna_whoip_current_ln == %ln) var %trace_has_current = 1
  5647. 5647
  5648. 5648 if ((%lastip == ninguna) && (%qid == $null) && (%trace_inflight != 1) && (%trace_has_current != 1)) {
  5649. 5649 var %livechans_trace2 = $_barna_nick_enabled_chans(%nick)
  5650. 5650
  5651. 5651 if (%livechans_trace2 != $null) {
  5652. 5652 if ($_barna_trace_force_whoip(%nick,%livechans_trace2)) {
  5653. 5653 var %lookupchans = %livechans_trace2
  5654. 5654 var %status = WHOIP_lookup_huerfano_RESCATADO_WHOIP
  5655. 5655 var %lookup = [ [ $+(%,barna_lookup.,%ln) ] ]
  5656. 5656 var %qry = [ [ $+(%,barna_qry.,%ln) ] ]
  5657. 5657 var %uqslot = [ [ $+(%,barna_userip_q_slot.,%ln) ] ]
  5658. 5658 var %uqpend = [ [ $+(%,barna_userip_q_pending.,%ln) ] ]
  5659. 5659 var %sent = [ [ $+(%,barna_userip_sent_recent.,%ln) ] ]
  5660. 5660 if (%lookup == $null) var %lookup = 0
  5661. 5661 if (%qry == $null) var %qry = 0
  5662. 5662 if (%uqslot == $null) var %uqslot = no
  5663. 5663 if (%uqpend == $null) var %uqpend = no
  5664. 5664 if (%sent == $null) var %sent = no
  5665. 5665 }
  5666. 5666 }
  5667. 5667 else {
  5668. 5668 unset %barna_lookup. $+ %ln
  5669. 5669 unset %barna_lookup_chans. $+ %ln
  5670. 5670 unset %barna_qry. $+ %ln
  5671. 5671 unset %barna_ipdone. $+ %ln
  5672. 5672 _barna_userip_q_release %nick TRACE_WHOIP_OFFLINE
  5673. 5673 var %lookup = 0
  5674. 5674 var %qry = 0
  5675. 5675 var %ipdone = 0
  5676. 5676 var %lookupchans = ninguno
  5677. 5677 var %status = WHOIP_lookup_limpiado_nick_no_online
  5678. 5678 }
  5679. 5679 }
  5680. 5680 }
  5681. 5681
  5682. 5682 window -a @BarnaTrace
  5683. 5683 echo @BarnaTrace $timestamp $chr(3) $+ 12 $+ [ASN-TRACE] $chr(15) nick= %nick estado= %status
  5684. 5684 echo @BarnaTrace $timestamp $chr(3) $+ 12 $+ [ASN-TRACE] $chr(15) canales= %seen lookup= %lookup lookup_chans= %lookupchans qry= %qry ipdone= %ipdone
  5685. 5685 echo @BarnaTrace $timestamp $chr(3) $+ 12 $+ [ASN-TRACE] $chr(15) whoip_slot= %uqslot whoip_pending= %uqpend sent_recent= %sent
  5686. 5686 echo @BarnaTrace $timestamp $chr(3) $+ 12 $+ [ASN-TRACE] $chr(15) last_ip= %lastip cache_asn= %cacheasn cache_isp= %cachename
  5687. 5687 echo @BarnaTrace $timestamp $chr(3) $+ 12 $+ [ASN-TRACE] $chr(15) qid= $iif(%qid != $null,%qid,ninguno) qstate= %qstate qip= %qip qchans= %qchans qtry= %qtry qage= %qage running= $iif(%barna_q_running != $null,%barna_q_running,0) sockets= $_barna_ipinfo_sock_count
  5688. 5688 echo @BarnaTrace $timestamp $chr(3) $+ 12 $+ [ASN-TRACE] $chr(15) seenguard enabled= %barna_seen_rescue seen= $var(%barna_seen.*,0) recent= $var(%barna_seen_rescue_recent.*,0) pos= %barna_seen_rescue_pos secs= %barna_seen_rescue_secs batch= %barna_seen_rescue_batch timer= CoreTick
  5689. 5689}
  5690. 5690
  5691. 5691alias barna.recheck {
  5692. 5692 _barna_runtime_defaults
  5693. 5693
  5694. 5694 if ($1 == $null) {
  5695. 5695 echo -a $chr(3) $+ 4 $+ [ASN] $chr(15) Uso: /barna.recheck <nick>
  5696. 5696 return
  5697. 5697 }
  5698. 5698
  5699. 5699 var %nick = $1
  5700. 5700 var %ln = $lower(%nick)
  5701. 5701
  5702. 5702 _barna_trace_refresh_seen %nick
  5703. 5703
  5704. 5704 var %seen = $_barna_seen_get(%nick)
  5705. 5705
  5706. 5706 if (%seen == $null) {
  5707. 5707 echo -a $chr(3) $+ 4 $+ [ASN] $chr(15) No reencolo $chr(2) $+ %nick $+ $chr(15) $+ : no está en ningún canal activado común.
  5708. 5708 return
  5709. 5709 }
  5710. 5710
  5711. 5711 var %qid = $_barna_trace_queue_find(%nick)
  5712. 5712
  5713. 5713 if (%qid != $null) {
  5714. 5714 _barna_q_schedule 1
  5715. 5715 _barna_core_start
  5716. 5716 _barna_asn_pump_start_if_needed
  5717. 5717 echo -a $chr(3) $+ 12 $+ [ASN] $chr(15) $+ $chr(32) $+ %nick ya tiene consulta ASN pendiente/activa. id= %qid chans= [ [ $+(%,barna_q_chans.,%qid) ] ]
  5718. 5718 return
  5719. 5719 }
  5720. 5720
  5721. 5721 _barna_userip_q_release %nick RECHECK_FORCE
  5722. 5722 unset %barna_lookup. $+ %ln
  5723. 5723 unset %barna_lookup_chans. $+ %ln
  5724. 5724 unset %barna_qry. $+ %ln
  5725. 5725 unset %barna_ipdone. $+ %ln
  5726. 5726 unset %barna_userip_q_chans. $+ %ln
  5727. 5727 unset %barna_userip_sent_recent. $+ %ln
  5728. 5728 unset %barna_userip_retry. $+ %ln
  5729. 5729 unset %barna_userip_sent_ts. $+ %ln
  5730. 5730 unset %barna_userip_sent_recent. $+ %ln
  5731. 5731
  5732. 5732 set -u90 %barna_qry. $+ %ln 1
  5733. 5733 set -u90 %barna_lookup. $+ %ln 1
  5734. 5734 set -u90 %barna_lookup_chans. $+ %ln %seen
  5735. 5735
  5736. 5736 _barna_userip_q_add %nick
  5737. 5737
  5738. 5738 echo -a $chr(3) $+ 12 $+ [ASN] $chr(15) Recheck encolado para $chr(2) $+ %nick $+ $chr(15) canales= %seen
  5739. 5739}
  5740. 5740
  5741. 5741alias barna.userip {
  5742. 5742 if ($1 == $null) {
  5743. 5743 echo -a $chr(3) $+ 4 $+ [ASN] $chr(15) Uso: /barna.userip <nick>
  5744. 5744 return
  5745. 5745 }
  5746. 5746
  5747. 5747 var %nick = $1
  5748. 5748 var %ln = $lower(%nick)
  5749. 5749
  5750. 5750 set -u20 %barna_manual_userip. $+ %ln 1
  5751. 5751 set -u20 %barna_manual_userip_win. $+ %ln $active
  5752. 5752
  5753. 5753 _barna_whoip_send %nick
  5754. 5754}
  5755. 5755
  5756. 5756alias barna.qstatus {
  5757. 5757 _barna_runtime_defaults
  5758. 5758 _barna_core_ensure_timers
  5759. 5759
  5760. 5760 ; Build 132: qstatus es realmente pasivo. No ejecuta STATECAP, compactaciones,
  5761. 5761 ; GC de sockets, cache, USERIP ni SAQUIT mientras recopila el estado.
  5762. 5762 ; Para mantenimiento manual usar los comandos especificos.
  5763. 5763
  5764. 5764 var %in = %barna_userip_inflight_count
  5765. 5765 var %qn = $numtok(%barna_q_items,44)
  5766. 5766 var %ql = $numtok(%barna_q_low_items,44)
  5767. 5767 var %qr = %barna_q_running
  5768. 5768
  5769. 5769 if (%in == $null) var %in = 0
  5770. 5770 if (%qn == $null) var %qn = 0
  5771. 5771 if (%ql == $null) var %ql = 0
  5772. 5772 if (%qr == $null) var %qr = 0
  5773. 5773
  5774. 5774 var %pt = $timer(BarnaASNPump)
  5775. 5775 if (%pt == $null) var %pt = OFF
  5776. 5776 else var %pt = ON
  5777. 5777
  5778. 5778 var %ct = $timer(BarnaCoreTick)
  5779. 5779 if (%ct == $null) var %ct = OFF
  5780. 5780 else var %ct = ON
  5781. 5781
  5782. 5782 echo -s [ASN] Build: %barna_build
  5783. 5783 echo -s [ASN] WHOIP pendientes: $_barna_userip_q_count max: %barna_userip_q_max_pending drop: %barna_userip_drop_count modo: BALANCEDSHED_ASNFAST autowhorescue= %barna_userip_stuck_rescue joinfix: $_barna_joinfix_q_count
  5784. 5784 echo -s [ASN] ASN normal: %qn ASN baja: %ql ASN running: %qr ASN heartbeat: %pt core: %ct directASN: ON asnfast: ON qbusy: %barna_q_process_busy ASN turbo desde: %barna_asn_turbo_threshold workers: $_barna_asn_workers_now sockets: $_barna_ipinfo_sock_count firstid: $_barna_asn_first_id firstnick: $_barna_asn_first_nick firstip: $_barna_asn_first_ip lastid: %barna_q_last_start_id lastsock: %barna_q_last_start_sock SAQUIT cola: $_barna_saquit_q_count
  5785. 5785 echo -s [ASN] Higiene: cacheASN= $var(%barna_asn_cache_asn.*,0) max= %barna_asn_cache_max_exact hard= %barna_asn_cache_hard_limit cachecap117= %barna_cachecap117_enabled qvars= $var(%barna_q_*,0) whoipvars= $var(%barna_userip_*,0) joinfixvars= $var(%barna_joinfix_*,0) saquitvars= $var(%barna_saquit*,0) echoqvars= $var(%barna_echo_q_*,0)
  5786. 5786 echo -s [ASN] Ritmo WHOIP normal: %barna_userip_q_batch_max cada %barna_userip_q_batch_delay $+ s
  5787. 5787 echo -s [ASN] Ritmo WHOIP turbo: desde %barna_userip_turbo_threshold pendientes, %barna_userip_turbo_batch_max cada %barna_userip_turbo_delay $+ s
  5788. 5788 echo -s [ASN] Ritmo WHOIP emergencia: desde %barna_userip_emergency_threshold pendientes, %barna_userip_emergency_batch_max cada %barna_userip_emergency_delay $+ s
  5789. 5789 echo -s [ASN] Modo WHOIP: DIRECT136_IPINFO_HTTPS / CoreTick solo colas + una familia por tick + capacidad adaptativa bajo presion + MARKGC cache seguro
  5790. 5790}
  5791. 5791
  5792. 5792alias barna.asnkick {
  5793. 5793 _barna_runtime_defaults
  5794. 5794 _barna_q_force_start
  5795. 5795 ; No ejecutar sanidad inmediatamente tras arrancar sockopen: mIRC puede tardar
  5796. 5796 ; un instante en exponer el socket en $sock(0).
  5797. 5797
  5798. 5798 var %qn = $numtok(%barna_q_items,44)
  5799. 5799 var %ql = $numtok(%barna_q_low_items,44)
  5800. 5800 var %qr = %barna_q_running
  5801. 5801
  5802. 5802 if (%qn == $null) var %qn = 0
  5803. 5803 if (%ql == $null) var %ql = 0
  5804. 5804 if (%qr == $null) var %qr = 0
  5805. 5805
  5806. 5806 echo -s [ASN] Motor ASN forzado. normal= %qn baja= %ql running= %qr heartbeat= $iif($timer(BarnaASNPump),ON,OFF) sockets= $_barna_ipinfo_sock_count
  5807. 5807}
  5808. 5808
  5809. 5809; ------------------------------------------------------------
  5810. 5810; BLOQUE 6.1
  5811. 5811; COLA LOCAL DE AVISOS EN CANALES
  5812. 5812; Evita congelar mIRC cuando se resuelven muchos ASN seguidos
  5813. 5813; ------------------------------------------------------------
  5814. 5814
  5815. 5815; Build 89: devuelve el nick con el case real que tiene mIRC en canal.
  5816. 5816; Si no se puede resolver, conserva el recibido.
  5817. 5817alias _barna_nick_display {
  5818. 5818 if ($1 == $null) return
  5819. 5819
  5820. 5820 ; Build 93: cero coste por aviso. No buscar en nicklist ni usar cache seen_display.
  5821. 5821 ; Se devuelve el nick recibido por RAW354/JOIN; el dedupe canonico usa minusculas.
  5822. 5822 return $1
  5823. 5823}
  5824. 5824
  5825. 5825; Build 92: dedupe ASN canonico por canal + nick en minusculas durante 90s, con GC/cap anti-lag.
  5826. 5826; No depende del texto completo ni de mayusculas/minusculas, asi que TERESARELAGUARR/teresarelaguarr
  5827. 5827; o FASTCACHE/rescate repetido no pueden duplicar el aviso en ventana corta.
  5828. 5828alias _barna_channel_echo_asn {
  5829. 5829 if ($1 == $null) return
  5830. 5830 if ($2 == $null) return
  5831. 5831 if ($3 == $null) return
  5832. 5832 if ($4 == $null) return
  5833. 5833
  5834. 5834 var %chan = $1
  5835. 5835 var %nick = $2
  5836. 5836 var %ip = $3
  5837. 5837 var %asn = $_barna_norm_asn($4)
  5838. 5838 var %msg = $5-
  5839. 5839
  5840. 5840 if (%msg == $null) return
  5841. 5841 if (%asn == $null) var %asn = $4
  5842. 5842
  5843. 5843 var %ck = $_barna_chan_key(%chan)
  5844. 5844 var %nk = $lower(%nick)
  5845. 5845 var %ipk = $replace(%ip,.,_)
  5846. 5846 var %ak = $remove($upper(%asn),AS)
  5847. 5847
  5848. 5848 ; Build 104: dedupe exacto por canal+nick+IP+ASN.
  5849. 5849 ; Evita doble aviso si WHOIP/cache/USERIP fallback resuelven el mismo nick casi a la vez,
  5850. 5850 ; pero no bloquea futuros cambios reales de IP/ASN del mismo nick.
  5851. 5851 var %dupe = $+(%,barna_echo_asn_seen.,%ck,.,%nk,.,%ipk,.,%ak)
  5852. 5852 var %ttl = %barna_echo_dedupe_secs
  5853. 5853
  5854. 5854 if (%ttl !isnum 1-) var %ttl = 90
  5855. 5855 if (%ttl > 90) var %ttl = 90
  5856. 5856 if (%ttl < 45) var %ttl = 45
  5857. 5857
  5858. 5858 if ($eval(%dupe,2) == 1) {
  5859. 5859 _barna_dbg ASN ECHO dedupe exacto: nick= %nick ip= %ip asn= %asn chan= %chan
  5860. 5860 return
  5861. 5861 }
  5862. 5862
  5863. 5863 ; Build 106: set dinamico real. Usar %dupe aqui creaba la variable literal %dupe
  5864. 5864 ; y no la marca %barna_echo_asn_seen.*, por eso el dedupe 104 no frenaba duplicados.
  5865. 5865 set $+(-u,%ttl) $+(%,barna_echo_asn_seen.,%ck,.,%nk,.,%ipk,.,%ak) 1
  5866. 5866
  5867. 5867 ; Build 93: ASN ya tiene dedupe canonico. No pasar por _barna_channel_echo
  5868. 5868 ; para evitar crear ademas %barna_echo_seen.<md5>, que crecia con cada aviso.
  5869. 5869 if (%barna_echo_queue != 1) {
  5870. 5870 echo %chan $timestamp %msg
  5871. 5871 return
  5872. 5872 }
  5873. 5873
  5874. 5874 _barna_echo_q_add %chan %msg
  5875. 5875}
  5876. 5876
  5877. 5877alias _barna_channel_echo {
  5878. 5878 if ($1 == $null) return
  5879. 5879
  5880. 5880 var %chan = $1
  5881. 5881 var %msg = $2-
  5882. 5882
  5883. 5883 if (%msg == $null) return
  5884. 5884
  5885. 5885 var %ck = $_barna_chan_key(%chan)
  5886. 5886 var %mk = $md5(%msg,0)
  5887. 5887 var %dupe = $+(%,barna_echo_seen.,%ck,.,%mk)
  5888. 5888 var %ttl = %barna_echo_dedupe_secs
  5889. 5889
  5890. 5890 if (%ttl !isnum 1-) var %ttl = 90
  5891. 5891 if (%ttl > 90) var %ttl = 90
  5892. 5892 if (%ttl < 45) var %ttl = 45
  5893. 5893 if ($eval(%dupe,2) == 1) return
  5894. 5894
  5895. 5895 ; Build 29: set directo del nombre dinamico real, no de la variable %dupe.
  5896. 5896 set $+(-u,%ttl) %barna_echo_seen. $+ %ck $+ . $+ %mk 1
  5897. 5897
  5898. 5898 if (%barna_echo_queue != 1) {
  5899. 5899 echo %chan $timestamp %msg
  5900. 5900 return
  5901. 5901 }
  5902. 5902
  5903. 5903 _barna_echo_q_add %chan %msg
  5904. 5904}
  5905. 5905
  5906. 5906alias _barna_echo_q_add {
  5907. 5907 if ($1 == $null) return
  5908. 5908 if ($2 == $null) return
  5909. 5909
  5910. 5910 ; Build 104: dedupe exacto de cola por canal+mensaje.
  5911. 5911 ; Es una segunda barrera por si dos rutas llegan antes de que el eco salga del buffer.
  5912. 5912 var %qck = $_barna_chan_key($1)
  5913. 5913 var %qmk = $md5($2-,0)
  5914. 5914 var %qdupe = $+(%,barna_echo_q_seen.,%qck,.,%qmk)
  5915. 5915 if ($eval(%qdupe,2) == 1) return
  5916. 5916 ; Build 106: set dinamico real de la marca de cola, no variable literal %qdupe.
  5917. 5917 set -u45 $+(%,barna_echo_q_seen.,%qck,.,%qmk) 1
  5918. 5918
  5919. 5919 if ($var(%barna_echo_q_seen.*,0) > 80) unset %barna_echo_q_seen.*
  5920. 5920
  5921. 5921 var %tail = %barna_echo_q_tail
  5922. 5922 if (%tail == $null) var %tail = 0
  5923. 5923 inc %tail
  5924. 5924
  5925. 5925 set %barna_echo_q_tail %tail
  5926. 5926 if (%barna_echo_q_head == $null) set %barna_echo_q_head 1
  5927. 5927
  5928. 5928 ; Build 93: limite duro de cola de avisos para que una rafaga no congele mIRC.
  5929. 5929 var %emax = %barna_echo_q_max
  5930. 5930 if (%emax !isnum 10-) var %emax = 160
  5931. 5931 if ($calc(%tail - %barna_echo_q_head) > %emax) {
  5932. 5932 var %old = %barna_echo_q_head
  5933. 5933 unset %barna_echo_q_chan. $+ %old
  5934. 5934 unset %barna_echo_q_msg. $+ %old
  5935. 5935 set %barna_echo_q_head $calc(%old + 1)
  5936. 5936 }
  5937. 5937
  5938. 5938 set -u300 %barna_echo_q_chan. $+ %tail $1
  5939. 5939 set -u300 %barna_echo_q_msg. $+ %tail $2-
  5940. 5940
  5941. 5941 _barna_echo_q_process
  5942. 5942}
  5943. 5943
  5944. 5944alias _barna_echo_q_fire {
  5945. 5945 unset %barna_echo_q_scheduled
  5946. 5946 _barna_echo_q_process
  5947. 5947}
  5948. 5948
  5949. 5949alias _barna_echo_q_process {
  5950. 5950 if (%barna_echo_q_running == 1) return
  5951. 5951
  5952. 5952 if (%barna_echo_q_head == $null) set %barna_echo_q_head 1
  5953. 5953 if (%barna_echo_q_tail == $null) return
  5954. 5954
  5955. 5955 var %head = %barna_echo_q_head
  5956. 5956 var %tail = %barna_echo_q_tail
  5957. 5957
  5958. 5958 if (%head > %tail) {
  5959. 5959 unset %barna_echo_q_head
  5960. 5960 unset %barna_echo_q_tail
  5961. 5961 unset %barna_echo_q_scheduled
  5962. 5962 return
  5963. 5963 }
  5964. 5964
  5965. 5965 set -u10 %barna_echo_q_running 1
  5966. 5966
  5967. 5967 var %max = %barna_echo_q_batch_max
  5968. 5968 if (%max !isnum 1-) var %max = 6
  5969. 5969 if (%max < 6) var %max = 6
  5970. 5970 if (%max > 8) var %max = 8
  5971. 5971
  5972. 5972 var %n = 0
  5973. 5973
  5974. 5974 while ((%n < %max) && (%head <= %tail)) {
  5975. 5975 var %chan = [ [ $+(%,barna_echo_q_chan.,%head) ] ]
  5976. 5976 var %msg = [ [ $+(%,barna_echo_q_msg.,%head) ] ]
  5977. 5977
  5978. 5978 unset %barna_echo_q_chan. $+ %head
  5979. 5979 unset %barna_echo_q_msg. $+ %head
  5980. 5980
  5981. 5981 if (%chan != $null) && (%msg != $null) {
  5982. 5982 echo %chan $timestamp %msg
  5983. 5983 }
  5984. 5984
  5985. 5985 inc %head
  5986. 5986 inc %n
  5987. 5987 }
  5988. 5988
  5989. 5989 set %barna_echo_q_head %head
  5990. 5990 unset %barna_echo_q_running
  5991. 5991
  5992. 5992 if (%head > %tail) {
  5993. 5993 unset %barna_echo_q_head
  5994. 5994 unset %barna_echo_q_tail
  5995. 5995 unset %barna_echo_q_scheduled
  5996. 5996 return
  5997. 5997 }
  5998. 5998
  5999. 5999 if (%barna_echo_q_scheduled == 1) return
  6000. 6000
  6001. 6001 var %delay = %barna_echo_q_delay
  6002. 6002 if (%delay !isnum 1-) var %delay = 1
  6003. 6003 if (%delay > 1) var %delay = 1
  6004. 6004
  6005. 6005 set -u30 %barna_echo_q_scheduled 1
  6006. 6006 .timerBarnaEchoQ 1 %delay _barna_echo_q_fire
  6007. 6007}
  6008. 6008
  6009. 6009alias _barna_cleanup_done {
  6010. 6010 var %ln = $lower($1)
  6011. 6011
  6012. 6012 _barna_lookup_timer_off $1
  6013. 6013
  6014. 6014 unset %barna_sock. $+ %ln
  6015. 6015 unset %barna_rx. $+ %ln
  6016. 6016 unset %barna_asn_done. $+ %ln
  6017. 6017 unset %temp_ip_ $+ $1
  6018. 6018 unset %asn_val. $+ $1
  6019. 6019 unset %as_name_val. $+ $1
  6020. 6020 unset %barna_ipdone. $+ %ln
  6021. 6021 unset %barna_userip_retry. $+ %ln
  6022. 6022 noop $_barna_join_guard_remove(%ln)
  6023. 6023}
  6024. 6024
  6025. 6025alias _barna_cleanup_leave {
  6026. 6026 var %ln = $lower($1)
  6027. 6027
  6028. 6028 _barna_lookup_timer_off $1
  6029. 6029
  6030. 6030 unset %barna_qry. $+ %ln
  6031. 6031 unset %barna_seen. $+ %ln
  6032. 6032 unset %barna_userip_retry. $+ %ln
  6033. 6033 unset %barna_lookup. $+ %ln
  6034. 6034 unset %barna_lookup_chans. $+ %ln
  6035. 6035 unset %barna_last_ip. $+ %ln
  6036. 6036
  6037. 6037 _barna_userip_q_release $1 LEAVE
  6038. 6038 noop $_barna_join_guard_remove(%ln)
  6039. 6039 _barna_join_audit_done $1 LEAVE
  6040. 6040
  6041. 6041 _barna_dbg LEAVE no cancela SAQUIT diferido ni consulta finalizada: nick= $1
  6042. 6042}
  6043. 6043
  6044. 6044; ------------------------------------------------------------
  6045. 6045; BLOQUE 6.9
  6046. 6046; AVISO @Parseline2 SOLO AL VER QUIT TRAS SAQUIT
  6047. 6047; ------------------------------------------------------------
  6048. 6048
  6049. 6049alias _barna_parseline_if_saquit_quit {
  6050. 6050 if ($1 == $null) return
  6051. 6051
  6052. 6052 var %nick = $1
  6053. 6053 var %ln = $lower(%nick)
  6054. 6054 var %sent = [ [ $+(%,barna_saquit_sent.,%ln) ] ]
  6055. 6055 var %pending = [ [ $+(%,barna_saquit_pending.,%ln) ] ]
  6056. 6056
  6057. 6057 ; Build 46:
  6058. 6058 ; Antes solo se escribia en @Parseline2 si ya se habia enviado el SAQUIT.
  6059. 6059 ; Si el nick salia antes de vencer el timer de 120s, quedaba cazado pero sin registro.
  6060. 6060 ; Ahora tambien se registra si tenia SAQUIT pendiente.
  6061. 6061 if ((%sent != 1) && (%pending != 1)) return
  6062. 6062
  6063. 6063 var %ip = [ [ $+(%,barna_saquit_ip.,%ln) ] ]
  6064. 6064 if (%ip == $null) var %ip = $_barna_ip_get(%nick)
  6065. 6065 var %chans = [ [ $+(%,barna_saquit_chans.,%ln) ] ]
  6066. 6066 var %msg = [ [ $+(%,barna_saquit_msg.,%ln) ] ]
  6067. 6067
  6068. 6068 if (%ip == $null) return
  6069. 6069 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  6070. 6070 if (%msg == $null) {
  6071. 6071 var %showchans = $replace(%chans,$chr(44),$+(,$chr(32)))
  6072. 6072 if (%sent == 1) var %msg = El usuario $chr(2) $+ %nick $+ $chr(15) (IP: $+ $chr(2) $+ %ip $+ $chr(15) $+ ) fue expulsado tras SAQUIT por ASN/prefijo bloqueado
  6073. 6073 else var %msg = El usuario $chr(2) $+ %nick $+ $chr(15) (IP: $+ $chr(2) $+ %ip $+ $chr(15) $+ ) estaba pendiente de SAQUIT por ASN/prefijo bloqueado y salio antes del temporizador
  6074. 6074 }
  6075. 6075
  6076. 6076 _barna_parseline_cazado %nick %ip %chans %msg
  6077. 6077
  6078. 6078 if (%sent == 1) _barna_saquit_cleanup_nick %nick QUIT_OK
  6079. 6079 else _barna_saquit_cleanup_nick %nick QUIT_PENDING_OK
  6080. 6080}
  6081. 6081
  6082. 6082alias _barna_saquit_cleanup_nick {
  6083. 6083 if ($1 == $null) return
  6084. 6084
  6085. 6085 var %nick = $1
  6086. 6086 var %ln = $lower(%nick)
  6087. 6087 var %t = [ [ $+(%,barna_saquit_timer.,%ln) ] ]
  6088. 6088
  6089. 6089 if (%t != $null) .timer $+ %t off
  6090. 6090
  6091. 6091 set -u2 $+(%,barna_saquit_ip.,%ln) 0
  6092. 6092 set -u2 $+(%,barna_saquit_chans.,%ln) 0
  6093. 6093 set -u2 $+(%,barna_saquit_pending.,%ln) 0
  6094. 6094 set -u2 $+(%,barna_saquit_timer.,%ln) 0
  6095. 6095 set -u2 $+(%,barna_saquit_sent.,%ln) 0
  6096. 6096 set -u2 $+(%,barna_saquit_msg.,%ln) 0
  6097. 6097 set -u2 $+(%,barna_saquit_showchans.,%ln) 0
  6098. 6098 set -u2 $+(%,barna_saquit_q_slot.,%ln) 0
  6099. 6099}
  6100. 6100
  6101. 6101alias _barna_saquit_gc_idle {
  6102. 6102 if ($_barna_saquit_q_count > 0) return 0
  6103. 6103
  6104. 6104 ; VARHYGIENE48:
  6105. 6105 ; No purgar %barna_saquit_pending/msg/ip/chans si hay timers BarnaSAQUIT_*
  6106. 6106 ; pendientes. En builds anteriores el GC podia borrar el estado antes del QUIT,
  6107. 6107 ; y entonces @Parseline2 no registraba los nicks que salian antes de 120s.
  6108. 6108 var %hascheck = 0
  6109. 6109 var %i = $timer(0)
  6110. 6110
  6111. 6111 while (%i > 0) {
  6112. 6112 var %t = $lower($timer(%i))
  6113. 6113
  6114. 6114 if (barnacheck_* iswm %t) var %hascheck = 1
  6115. 6115 if (barnafinal_* iswm %t) var %hascheck = 1
  6116. 6116 if (barnasaquit_* iswm %t) var %hascheck = 1
  6117. 6117
  6118. 6118 dec %i
  6119. 6119 }
  6120. 6120
  6121. 6121 if (%hascheck == 1) return 0
  6122. 6122
  6123. 6123 var %before = $var(%barna_saquit*,0)
  6124. 6124
  6125. 6125 if (%before <= 1) return 0
  6126. 6126
  6127. 6127 unset %barna_saquit_showchans.*
  6128. 6128 unset %barna_saquit_msg.*
  6129. 6129 unset %barna_saquit_ip.*
  6130. 6130 unset %barna_saquit_chans.*
  6131. 6131 unset %barna_saquit_pending.*
  6132. 6132 unset %barna_saquit_timer.*
  6133. 6133 unset %barna_saquit_sent.*
  6134. 6134 unset %barna_saquit_q_item.*
  6135. 6135 unset %barna_saquit_q_due.*
  6136. 6136 unset %barna_saquit_q_slot.*
  6137. 6137 unset %barna_saquit_q_head
  6138. 6138 unset %barna_saquit_q_tail
  6139. 6139 unset %barna_saquit_q_count_real
  6140. 6140
  6141. 6141 _barna_dbg SAQUITGC idle: antes= %before despues= $var(%barna_saquit*,0)
  6142. 6142
  6143. 6143 return 1
  6144. 6144}
  6145. 6145
  6146. 6146; ------------------------------------------------------------
  6147. 6147; BLOQUE 7
  6148. 6148; EVENTOS DE SALIDA
  6149. 6149; ------------------------------------------------------------
  6150. 6150
  6151. 6151on *:QUIT:{
  6152. 6152 if (%barna_addon != 1) return
  6153. 6153
  6154. 6154 ; VARHYGIENE48:
  6155. 6155 ; Parseline2 debe comprobarse ANTES de depender de %barna_seen.*.
  6156. 6156 ; LOOKCLEAN/LAGCLEAN pueden limpiar seen/lookup antes del QUIT real, pero si hay
  6157. 6157 ; %barna_saquit_pending.* o %barna_saquit_sent.* el nick debe quedar registrado.
  6158. 6158 _barna_parseline_if_saquit_quit $nick
  6159. 6159
  6160. 6160 if ($_barna_seen_get($nick) == $null) return
  6161. 6161
  6162. 6162 _barna_cleanup_leave $nick
  6163. 6163}
  6164. 6164
  6165. 6165on *:PART:#:{
  6166. 6166 if (%barna_addon != 1) return
  6167. 6167 if (!$_barna_is_chan_enabled($chan)) return
  6168. 6168
  6169. 6169 _barna_seen_del $nick $chan
  6170. 6170
  6171. 6171 if ($_barna_seen_get($nick) == $null) {
  6172. 6172 _barna_cleanup_leave $nick
  6173. 6173 }
  6174. 6174}
  6175. 6175
  6176. 6176on *:KICK:#:{
  6177. 6177 if (%barna_addon != 1) return
  6178. 6178 if (!$_barna_is_chan_enabled($chan)) return
  6179. 6179
  6180. 6180 _barna_seen_del $knick $chan
  6181. 6181
  6182. 6182 if ($_barna_seen_get($knick) == $null) {
  6183. 6183 _barna_cleanup_leave $knick
  6184. 6184 }
  6185. 6185}
  6186. 6186
  6187. 6187on *:OP:#:{
  6188. 6188 if (%barna_addon != 1) return
  6189. 6189 if (!$_barna_is_chan_enabled($chan)) return
  6190. 6190
  6191. 6191 _barna_privileged_cleanup_nick $opnick OP
  6192. 6192 _barna_dbg PRIVSAFE OP/@ protegido: nick= $opnick canal= $chan
  6193. 6193}
  6194. 6194
  6195. 6195on *:VOICE:#:{
  6196. 6196 if (%barna_addon != 1) return
  6197. 6197 if (!$_barna_is_chan_enabled($chan)) return
  6198. 6198
  6199. 6199 _barna_privileged_cleanup_nick $vnick VOICE
  6200. 6200 _barna_dbg PRIVSAFE VOICE/+v protegido: nick= $vnick canal= $chan
  6201. 6201}
  6202. 6202
  6203. 6203on *:NICK:{
  6204. 6204 if (%barna_addon != 1) return
  6205. 6205
  6206. 6206 var %old = $nick
  6207. 6207 var %new = $newnick
  6208. 6208 var %oldln = $lower(%old)
  6209. 6209 var %newln = $lower(%new)
  6210. 6210
  6211. 6211 ; Build 95: no se migra %barna_seen.* porque ya no se guarda estado seen por JOIN.
  6212. 6212 unset %barna_seen. $+ %oldln
  6213. 6213 unset %barna_seen_display. $+ %oldln
  6214. 6214
  6215. 6215 var %lookup = [ [ $+(%,barna_lookup.,%oldln) ] ]
  6216. 6216 if (%lookup == 1) {
  6217. 6217 var %ttl = $_barna_userip_ttl
  6218. 6218 var %lookup_chans = [ [ $+(%,barna_lookup_chans.,%oldln) ] ]
  6219. 6219 var %retry = [ [ $+(%,barna_userip_retry.,%oldln) ] ]
  6220. 6220 var %slowretry = [ [ $+(%,barna_userip_slow_retry.,%oldln) ] ]
  6221. 6221
  6222. 6222 set $+(-u,%ttl) %barna_lookup. $+ %newln 1
  6223. 6223 set $+(-u,%ttl) %barna_qry. $+ %newln 1
  6224. 6224 set $+(-u,%ttl) %barna_userip_q_nick. $+ %newln %new
  6225. 6225
  6226. 6226 if (%lookup_chans != $null) set $+(-u,%ttl) %barna_lookup_chans. $+ %newln %lookup_chans
  6227. 6227 if (%retry != $null) set $+(-u,%ttl) %barna_userip_retry. $+ %newln %retry
  6228. 6228 if (%slowretry != $null) set -u3600 %barna_userip_slow_retry. $+ %newln %slowretry
  6229. 6229
  6230. 6230 if ([ [ $+(%,barna_userip_q_pending.,%oldln) ] ] == 1) {
  6231. 6231 var %slot = [ [ $+(%,barna_userip_q_slot.,%oldln) ] ]
  6232. 6232
  6233. 6233 unset %barna_userip_q_pending. $+ %oldln
  6234. 6234 unset %barna_userip_q_slot. $+ %oldln
  6235. 6235
  6236. 6236 set $+(-u,%ttl) %barna_userip_q_pending. $+ %newln 1
  6237. 6237
  6238. 6238 if (%slot != $null) {
  6239. 6239 set $+(-u,%ttl) %barna_userip_q_slot. $+ %newln %slot
  6240. 6240 set $+(-u,%ttl) %barna_userip_q_item. $+ %slot %newln
  6241. 6241 }
  6242. 6242 else {
  6243. 6243 unset %barna_userip_q_pending. $+ %newln
  6244. 6244 _barna_userip_q_add %new
  6245. 6245 }
  6246. 6246 }
  6247. 6247
  6248. 6248 if ([ [ $+(%,barna_userip_inflight.,%oldln) ] ] == 1) {
  6249. 6249 _barna_lookup_timer_off %old
  6250. 6250 unset %barna_userip_inflight. $+ %oldln
  6251. 6251 unset %barna_userip_sent_ts. $+ %oldln
  6252. 6252 unset %barna_userip_watchtry. $+ %oldln
  6253. 6253 _barna_userip_inflight_dec
  6254. 6254 _barna_userip_q_add %new
  6255. 6255 }
  6256. 6256
  6257. 6257 unset %barna_lookup. $+ %oldln
  6258. 6258 unset %barna_lookup_chans. $+ %oldln
  6259. 6259 unset %barna_qry. $+ %oldln
  6260. 6260 unset %barna_userip_retry. $+ %oldln
  6261. 6261 unset %barna_userip_slow_retry. $+ %oldln
  6262. 6262 unset %barna_userip_q_nick. $+ %oldln
  6263. 6263
  6264. 6264 _barna_dbg WHOIP COLA migrada por cambio de nick: old= %old new= %new
  6265. 6265 }
  6266. 6266
  6267. 6267 var %ip = [ [ $+(%,barna_saquit_ip.,%oldln) ] ]
  6268. 6268 var %chans = [ [ $+(%,barna_saquit_chans.,%oldln) ] ]
  6269. 6269 var %msg = [ [ $+(%,barna_saquit_msg.,%oldln) ] ]
  6270. 6270 var %showchans = [ [ $+(%,barna_saquit_showchans.,%oldln) ] ]
  6271. 6271 var %pending = [ [ $+(%,barna_saquit_pending.,%oldln) ] ]
  6272. 6272 var %oldt = [ [ $+(%,barna_saquit_timer.,%oldln) ] ]
  6273. 6273
  6274. 6274 if (%pending == 1) {
  6275. 6275 if (%oldt != $null) .timer $+ %oldt off
  6276. 6276
  6277. 6277 unset %barna_saquit_ip. $+ %oldln
  6278. 6278 unset %barna_saquit_chans. $+ %oldln
  6279. 6279 unset %barna_saquit_msg. $+ %oldln
  6280. 6280 unset %barna_saquit_showchans. $+ %oldln
  6281. 6281 unset %barna_saquit_pending. $+ %oldln
  6282. 6282 unset %barna_saquit_timer. $+ %oldln
  6283. 6283
  6284. 6284 if (%chans == $null) var %chans = %seen
  6285. 6285
  6286. 6286 _barna_dbg SAQUIT migrado por cambio de nick: old= %old new= %new ip= %ip chans= %chans
  6287. 6287
  6288. 6288 if (%ip != $null) && (%chans != $null) {
  6289. 6289 if (%msg != $null) set -u900 %barna_saquit_msg. $+ %newln %msg
  6290. 6290 if (%showchans != $null) set -u900 %barna_saquit_showchans. $+ %newln %showchans
  6291. 6291
  6292. 6292 _barna_shun_nick %new Molestias en Canales (A)
  6293. 6293 _barna_schedule_delayed_saquit %new %ip %chans
  6294. 6294 }
  6295. 6295 }
  6296. 6296
  6297. 6297 noop $_barna_joinfix_recheck_if_needed(%new,NICK_CHANGE_FROM_ $+ %old)
  6298. 6298}
  6299. 6299
  6300. 6300
  6301. 6301; ------------------------------------------------------------
  6302. 6302; BLOQUE 7.5
  6303. 6303; AUDITOR DE JOIN PARA EVITAR NICKS SALTADOS
  6304. 6304; ------------------------------------------------------------
  6305. 6305
  6306. 6306alias _barna_join_audit_q_count {
  6307. 6307 var %n = %barna_join_audit_q_count_real
  6308. 6308
  6309. 6309 if (%n !isnum 1-) return 0
  6310. 6310
  6311. 6311 return %n
  6312. 6312}
  6313. 6313
  6314. 6314alias _barna_join_audit_q_count_inc {
  6315. 6315 var %n = %barna_join_audit_q_count_real
  6316. 6316
  6317. 6317 if (%n == $null) var %n = 0
  6318. 6318 inc %n
  6319. 6319 set -u900 %barna_join_audit_q_count_real %n
  6320. 6320}
  6321. 6321
  6322. 6322alias _barna_join_audit_q_count_dec {
  6323. 6323 var %n = %barna_join_audit_q_count_real
  6324. 6324
  6325. 6325 if (%n == $null) var %n = 0
  6326. 6326 dec %n
  6327. 6327
  6328. 6328 if (%n < 0) var %n = 0
  6329. 6329
  6330. 6330 if (%n == 0) unset %barna_join_audit_q_count_real
  6331. 6331 else set -u900 %barna_join_audit_q_count_real %n
  6332. 6332}
  6333. 6333
  6334. 6334alias _barna_join_audit_schedule {
  6335. 6335 if (%barna_join_audit != 1) return
  6336. 6336
  6337. 6337 var %delay = %barna_join_audit_delay
  6338. 6338 if (%delay !isnum 5-) var %delay = 18
  6339. 6339
  6340. 6340 if (%barna_join_audit_q_scheduled == 1) return
  6341. 6341
  6342. 6342 set -u120 %barna_join_audit_q_scheduled 1
  6343. 6343 .timerBarnaJoinAudit 1 %delay _barna_join_audit_process
  6344. 6344}
  6345. 6345
  6346. 6346alias _barna_join_audit_enqueue {
  6347. 6347 if ($1 == $null) return
  6348. 6348
  6349. 6349 var %ln = $1
  6350. 6350 var %tail = %barna_join_audit_q_tail
  6351. 6351
  6352. 6352 if (%tail == $null) var %tail = 0
  6353. 6353 inc %tail
  6354. 6354
  6355. 6355 set %barna_join_audit_q_tail %tail
  6356. 6356 if (%barna_join_audit_q_head == $null) set %barna_join_audit_q_head 1
  6357. 6357
  6358. 6358 set -u900 %barna_join_audit_q_item. $+ %tail %ln
  6359. 6359 set -u900 %barna_join_audit_q_slot. $+ %ln %tail
  6360. 6360 _barna_join_audit_q_count_inc
  6361. 6361}
  6362. 6362
  6363. 6363alias _barna_join_audit_mark {
  6364. 6364 if (%barna_join_audit != 1) return
  6365. 6365 if ($1 == $null) return
  6366. 6366
  6367. 6367 var %nick = $1
  6368. 6368 var %ln = $lower(%nick)
  6369. 6369 var %chans = $_barna_seen_get(%nick)
  6370. 6370
  6371. 6371 if (%chans == $null) return
  6372. 6372
  6373. 6373 set -u900 %barna_join_audit_nick. $+ %ln %nick
  6374. 6374 set -u900 %barna_join_audit_chans. $+ %ln %chans
  6375. 6375 set -u900 %barna_join_audit_ts. $+ %ln $ctime
  6376. 6376
  6377. 6377 if ([ [ $+(%,barna_join_audit_q_slot.,%ln) ] ] == $null) {
  6378. 6378 _barna_join_audit_enqueue %ln
  6379. 6379 }
  6380. 6380
  6381. 6381 _barna_join_audit_schedule
  6382. 6382}
  6383. 6383
  6384. 6384alias _barna_join_audit_done {
  6385. 6385 if ($1 == $null) return
  6386. 6386
  6387. 6387 var %nick = $1
  6388. 6388 var %ln = $lower(%nick)
  6389. 6389 var %slot = [ [ $+(%,barna_join_audit_q_slot.,%ln) ] ]
  6390. 6390
  6391. 6391 if (%slot != $null) {
  6392. 6392 if ([ [ $+(%,barna_join_audit_q_item.,%slot) ] ] != $null) _barna_join_audit_q_count_dec
  6393. 6393 unset %barna_join_audit_q_item. $+ %slot
  6394. 6394 unset %barna_join_audit_q_slot. $+ %ln
  6395. 6395 }
  6396. 6396
  6397. 6397 unset %barna_join_audit_nick. $+ %ln
  6398. 6398 unset %barna_join_audit_chans. $+ %ln
  6399. 6399 unset %barna_join_audit_ts. $+ %ln
  6400. 6400 unset %barna_join_audit_try. $+ %ln
  6401. 6401
  6402. 6402 _barna_dbg JOIN AUDIT done: nick= %nick reason= $2-
  6403. 6403}
  6404. 6404
  6405. 6405alias _barna_join_audit_requeue {
  6406. 6406 if ($1 == $null) return
  6407. 6407
  6408. 6408 var %ln = $1
  6409. 6409
  6410. 6410 if ([ [ $+(%,barna_join_audit_q_slot.,%ln) ] ] != $null) return
  6411. 6411
  6412. 6412 _barna_join_audit_enqueue %ln
  6413. 6413}
  6414. 6414
  6415. 6415alias _barna_join_audit_process {
  6416. 6416 if (%barna_join_audit != 1) return
  6417. 6417
  6418. 6418 unset %barna_join_audit_q_scheduled
  6419. 6419
  6420. 6420 if ($_barna_join_audit_q_count == 0) {
  6421. 6421 unset %barna_join_audit_q_head
  6422. 6422 unset %barna_join_audit_q_tail
  6423. 6423 return
  6424. 6424 }
  6425. 6425
  6426. 6426 var %batch = %barna_join_audit_batch
  6427. 6427 if (%batch !isnum 5-) var %batch = 60
  6428. 6428
  6429. 6429 var %done = 0
  6430. 6430 var %guard = 0
  6431. 6431
  6432. 6432 while ((%done < %batch) && (%guard < 300) && ($_barna_join_audit_q_count > 0)) {
  6433. 6433 inc %guard
  6434. 6434 inc %done
  6435. 6435
  6436. 6436 var %head = %barna_join_audit_q_head
  6437. 6437 var %tail = %barna_join_audit_q_tail
  6438. 6438
  6439. 6439 if (%head == $null) break
  6440. 6440 if (%tail == $null) break
  6441. 6441
  6442. 6442 if (%head > %tail) {
  6443. 6443 unset %barna_join_audit_q_head
  6444. 6444 unset %barna_join_audit_q_tail
  6445. 6445 break
  6446. 6446 }
  6447. 6447
  6448. 6448 var %ln = [ [ $+(%,barna_join_audit_q_item.,%head) ] ]
  6449. 6449
  6450. 6450 if (%ln != $null) _barna_join_audit_q_count_dec
  6451. 6451 unset %barna_join_audit_q_item. $+ %head
  6452. 6452 set %barna_join_audit_q_head $calc(%head + 1)
  6453. 6453
  6454. 6454 if (%ln == $null) continue
  6455. 6455
  6456. 6456 unset %barna_join_audit_q_slot. $+ %ln
  6457. 6457
  6458. 6458 var %nick = [ [ $+(%,barna_join_audit_nick.,%ln) ] ]
  6459. 6459 if (%nick == $null) var %nick = %ln
  6460. 6460
  6461. 6461 var %chans = $_barna_seen_get(%nick)
  6462. 6462 if (%chans == $null) var %chans = [ [ $+(%,barna_join_audit_chans.,%ln) ] ]
  6463. 6463
  6464. 6464 if (%chans == $null) {
  6465. 6465 _barna_join_audit_done %nick SIN_CANALES
  6466. 6466 continue
  6467. 6467 }
  6468. 6468
  6469. 6469 if ([ [ $+(%,barna_q_active.,%ln) ] ] != $null) {
  6470. 6470 _barna_join_audit_requeue %ln
  6471. 6471 continue
  6472. 6472 }
  6473. 6473
  6474. 6474 if ([ [ $+(%,barna_q_pending.,%ln) ] ] != $null) {
  6475. 6475 _barna_join_audit_requeue %ln
  6476. 6476 continue
  6477. 6477 }
  6478. 6478
  6479. 6479 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) {
  6480. 6480 _barna_join_audit_requeue %ln
  6481. 6481 continue
  6482. 6482 }
  6483. 6483
  6484. 6484 if ([ [ $+(%,barna_userip_q_pending.,%ln) ] ] == 1) {
  6485. 6485 _barna_join_audit_requeue %ln
  6486. 6486 continue
  6487. 6487 }
  6488. 6488
  6489. 6489 var %try = [ [ $+(%,barna_join_audit_try.,%ln) ] ]
  6490. 6490 if (%try == $null) var %try = 0
  6491. 6491 inc %try
  6492. 6492
  6493. 6493 var %max = %barna_join_audit_max_retries
  6494. 6494 if (%max !isnum 0-) var %max = 2
  6495. 6495
  6496. 6496 if (%try > %max) {
  6497. 6497 _barna_dbg JOIN AUDIT agotado sin RAW340: nick= %nick chans= %chans try= %try
  6498. 6498 _barna_join_audit_done %nick AGOTADO
  6499. 6499 continue
  6500. 6500 }
  6501. 6501
  6502. 6502 set -u60 %barna_join_audit_try. $+ %ln %try
  6503. 6503 set -u60 %barna_lookup. $+ %ln 1
  6504. 6504 set -u60 %barna_lookup_chans. $+ %ln %chans
  6505. 6505 set -u60 %barna_qry. $+ %ln 1
  6506. 6506
  6507. 6507 unset %barna_ipdone. $+ %ln
  6508. 6508 unset %barna_userip_sent_ts. $+ %ln
  6509. 6509 unset %barna_userip_watchtry. $+ %ln
  6510. 6510
  6511. 6511 _barna_dbg JOIN AUDIT reencola USERIP: nick= %nick chans= %chans try= %try
  6512. 6512
  6513. 6513 _barna_userip_q_add %nick
  6514. 6514 _barna_join_audit_requeue %ln
  6515. 6515 }
  6516. 6516
  6517. 6517 if ($_barna_join_audit_q_count > 0) _barna_join_audit_schedule
  6518. 6518}
  6519. 6519
  6520. 6520; ------------------------------------------------------------
  6521. 6521; BLOQUE 7.6
  6522. 6522; CAPTURA IP USERIP/WHOIP
  6523. 6523; ------------------------------------------------------------
  6524. 6524
  6525. 6525
  6526. 6526
  6527. 6527; ------------------------------------------------------------
  6528. 6528; BLOQUE 8.7.5
  6529. 6529; COMPACTACION DE VARIABLES Huerfanas
  6530. 6530; ------------------------------------------------------------
  6531. 6531
  6532. 6532alias _barna_q_compact_vars {
  6533. 6533 _barna_runtime_defaults
  6534. 6534
  6535. 6535 ; VARHYGIENE5: antes de compactar, elimina running fantasma.
  6536. 6536 ; Si hay socket real, no se toca nada. Si running>0 pero sockets=0,
  6537. 6537 ; _barna_q_clear_ghost_running decide si ya ha pasado la gracia.
  6538. 6538 if ($_barna_ipinfo_sock_count > 0) return 0
  6539. 6539 _barna_q_clear_ghost_light
  6540. 6540 noop $_barna_sockto_orphan_gc
  6541. 6541
  6542. 6542 var %running = %barna_q_running
  6543. 6543 if (%running == $null) var %running = 0
  6544. 6544 if (%running > 0) return 0
  6545. 6545 if ($_barna_ipinfo_sock_count > 0) return 0
  6546. 6546
  6547. 6547 var %qv_before = $var(%barna_q_*,0)
  6548. 6548 var %items = %barna_q_items
  6549. 6549 var %lowitems = %barna_q_low_items
  6550. 6550 var %newitems = $null
  6551. 6551 var %newlow = $null
  6552. 6552 var %i = 1
  6553. 6553
  6554. 6554 if ($hget(barna_q_keep)) hfree barna_q_keep
  6555. 6555 hmake barna_q_keep 500
  6556. 6556
  6557. 6557 while (%i <= $numtok(%items,44)) {
  6558. 6558 var %id = $gettok(%items,%i,44)
  6559. 6559 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  6560. 6560 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  6561. 6561 var %chans = [ [ $+(%,barna_q_chans.,%id) ] ]
  6562. 6562 var %try = [ [ $+(%,barna_q_try.,%id) ] ]
  6563. 6563 var %ts = [ [ $+(%,barna_q_ts.,%id) ] ]
  6564. 6564
  6565. 6565 if ((%id != $null) && (%nick != $null) && (%ip != $null)) {
  6566. 6566 if (%newitems == $null) var %newitems = %id
  6567. 6567 else if (!$istok(%newitems,%id,44)) var %newitems = $addtok(%newitems,%id,44)
  6568. 6568 hadd -m barna_q_keep $+(nick.,%id) %nick
  6569. 6569 hadd -m barna_q_keep $+(ip.,%id) %ip
  6570. 6570 if (%chans != $null) hadd -m barna_q_keep $+(chans.,%id) %chans
  6571. 6571 if (%try == $null) var %try = 0
  6572. 6572 hadd -m barna_q_keep $+(try.,%id) %try
  6573. 6573 if (%ts == $null) var %ts = $ctime
  6574. 6574 hadd -m barna_q_keep $+(ts.,%id) %ts
  6575. 6575 }
  6576. 6576
  6577. 6577 inc %i
  6578. 6578 }
  6579. 6579
  6580. 6580 var %j = 1
  6581. 6581 while (%j <= $numtok(%lowitems,44)) {
  6582. 6582 var %id2 = $gettok(%lowitems,%j,44)
  6583. 6583 var %nick2 = [ [ $+(%,barna_q_nick.,%id2) ] ]
  6584. 6584 var %ip2 = [ [ $+(%,barna_q_ip.,%id2) ] ]
  6585. 6585 var %chans2 = [ [ $+(%,barna_q_chans.,%id2) ] ]
  6586. 6586 var %try2 = [ [ $+(%,barna_q_try.,%id2) ] ]
  6587. 6587 var %ts2 = [ [ $+(%,barna_q_ts.,%id2) ] ]
  6588. 6588
  6589. 6589 if ((%id2 != $null) && (%nick2 != $null) && (%ip2 != $null)) {
  6590. 6590 if (%newlow == $null) var %newlow = %id2
  6591. 6591 else if (!$istok(%newlow,%id2,44)) var %newlow = $addtok(%newlow,%id2,44)
  6592. 6592 hadd -m barna_q_keep $+(nick.,%id2) %nick2
  6593. 6593 hadd -m barna_q_keep $+(ip.,%id2) %ip2
  6594. 6594 if (%chans2 != $null) hadd -m barna_q_keep $+(chans.,%id2) %chans2
  6595. 6595 if (%try2 == $null) var %try2 = 0
  6596. 6596 hadd -m barna_q_keep $+(try.,%id2) %try2
  6597. 6597 if (%ts2 == $null) var %ts2 = $ctime
  6598. 6598 hadd -m barna_q_keep $+(ts.,%id2) %ts2
  6599. 6599 hadd -m barna_q_keep $+(low.,%id2) 1
  6600. 6600 }
  6601. 6601
  6602. 6602 inc %j
  6603. 6603 }
  6604. 6604
  6605. 6605 unset %barna_q_*
  6606. 6606 _barna_runtime_defaults
  6607. 6607
  6608. 6608 if (%newitems != $null) set %barna_q_items %newitems
  6609. 6609 if (%newlow != $null) set %barna_q_low_items %newlow
  6610. 6610
  6611. 6611 var %k = 1
  6612. 6612 var %all = %newitems
  6613. 6613 var %l = 1
  6614. 6614 while (%l <= $numtok(%newlow,44)) {
  6615. 6615 var %lid = $gettok(%newlow,%l,44)
  6616. 6616 if ((%lid != $null) && (!$istok(%all,%lid,44))) var %all = $addtok(%all,%lid,44)
  6617. 6617 inc %l
  6618. 6618 }
  6619. 6619
  6620. 6620 while (%k <= $numtok(%all,44)) {
  6621. 6621 var %rid = $gettok(%all,%k,44)
  6622. 6622 var %rnick = $hget(barna_q_keep,$+(nick.,%rid))
  6623. 6623 var %rip = $hget(barna_q_keep,$+(ip.,%rid))
  6624. 6624 var %rchans = $hget(barna_q_keep,$+(chans.,%rid))
  6625. 6625 var %rtry = $hget(barna_q_keep,$+(try.,%rid))
  6626. 6626 var %rts = $hget(barna_q_keep,$+(ts.,%rid))
  6627. 6627
  6628. 6628 if ((%rid != $null) && (%rnick != $null) && (%rip != $null)) {
  6629. 6629 set -u600 %barna_q_nick. $+ %rid %rnick
  6630. 6630 set -u120 %barna_q_ip. $+ %rid %rip
  6631. 6631 if (%rchans != $null) set -u120 %barna_q_chans. $+ %rid %rchans
  6632. 6632 if (%rtry == $null) var %rtry = 0
  6633. 6633 set -u120 %barna_q_try. $+ %rid %rtry
  6634. 6634 if (%rts == $null) var %rts = $ctime
  6635. 6635 set -u120 %barna_q_ts. $+ %rid %rts
  6636. 6636 set -u120 %barna_q_pending. $+ $lower(%rnick) %rid
  6637. 6637 if ($hget(barna_q_keep,$+(low.,%rid)) == 1) set -u600 %barna_q_low. $+ %rid 1
  6638. 6638 }
  6639. 6639
  6640. 6640 inc %k
  6641. 6641 }
  6642. 6642
  6643. 6643 if ($hget(barna_q_keep)) hfree barna_q_keep
  6644. 6644
  6645. 6645 var %qv_after = $var(%barna_q_*,0)
  6646. 6646 if (%qv_before > %qv_after) {
  6647. 6647 _barna_dbg HIGIENE cola ASN compactada: antes= %qv_before despues= %qv_after normal= $numtok(%barna_q_items,44) baja= $numtok(%barna_q_low_items,44)
  6648. 6648 _barna_asn_pump_start_if_needed
  6649. 6649 return 1
  6650. 6650 }
  6651. 6651
  6652. 6652 return 0
  6653. 6653}
  6654. 6654
  6655. 6655
  6656. 6656alias _barna_q_idle_gc {
  6657. 6657 ; VARHYGIENE12:
  6658. 6658 ; Si la cola ASN real esta vacia, no tiene sentido conservar cientos de
  6659. 6659 ; variables %barna_q_* de IDs ya terminados. Esto evita lag acumulativo
  6660. 6660 ; al abrir/cerrar editor y al evaluar $var(%barna_q_*,0).
  6661. 6661 _barna_runtime_defaults
  6662. 6662
  6663. 6663 var %live = $calc($numtok(%barna_q_items,44) + $numtok(%barna_q_low_items,44))
  6664. 6664 var %running = %barna_q_running
  6665. 6665 if (%running == $null) var %running = 0
  6666. 6666
  6667. 6667 if ((%live == 0) && (%running == 0) && ($_barna_ipinfo_sock_count == 0)) {
  6668. 6668 var %before = $var(%barna_q_*,0)
  6669. 6669
  6670. 6670 if (%before > 40) {
  6671. 6671 noop $_barna_q_temp_clear
  6672. 6672 _barna_dbg HIGIENE cola ASN idle limpiada completa: antes= %before despues= $var(%barna_q_*,0)
  6673. 6673 return 1
  6674. 6674 }
  6675. 6675 }
  6676. 6676
  6677. 6677 return 0
  6678. 6678}
  6679. 6679
  6680. 6680alias _barna_userip_vartrim_idle {
  6681. 6681 _barna_runtime_defaults
  6682. 6682
  6683. 6683 var %qcnt = $_barna_userip_q_count
  6684. 6684 var %before = $var(%barna_userip_*,0)
  6685. 6685 if (%before <= 0) return 0
  6686. 6686
  6687. 6687 ; VARHYGIENE5: si hay muy pocos USERIP pendientes pero cientos de variables,
  6688. 6688 ; es mejor descartar esos pocos pendientes que dejar mIRC ahogado.
  6689. 6689 var %umax = %barna_userip_var_max_idle
  6690. 6690 if (%umax !isnum 50-) var %umax = 80
  6691. 6691
  6692. 6692 if ((%qcnt == 0) && ($timer(BarnaUserIPBatch) == $null) && (%before > 40)) goto barna_userip_trim_ok
  6693. 6693 if ((%qcnt > 0) && (%before <= %umax)) return 0
  6694. 6694 if (%qcnt > 20) return 0
  6695. 6695
  6696. 6696 :barna_userip_trim_ok
  6697. 6697
  6698. 6698 var %delay = %barna_userip_q_delay
  6699. 6699 var %batch = %barna_userip_q_batch_max
  6700. 6700 var %batchdelay = %barna_userip_q_batch_delay
  6701. 6701 var %turbo_th = %barna_userip_turbo_threshold
  6702. 6702 var %turbo_batch = %barna_userip_turbo_batch_max
  6703. 6703 var %turbo_delay = %barna_userip_turbo_delay
  6704. 6704 var %emerg_th = %barna_userip_emergency_threshold
  6705. 6705 var %emerg_batch = %barna_userip_emergency_batch_max
  6706. 6706 var %emerg_delay = %barna_userip_emergency_delay
  6707. 6707 var %maxp = %barna_userip_q_max_pending
  6708. 6708 var %shedto = %barna_userip_q_shed_to
  6709. 6709 var %drop = %barna_userip_drop_count
  6710. 6710 var %ttl = %barna_userip_state_ttl
  6711. 6711 var %maxin = %barna_userip_max_inflight
  6712. 6712
  6713. 6713 unset %barna_userip_*
  6714. 6714 _barna_runtime_defaults
  6715. 6715
  6716. 6716 if (%delay != $null) set %barna_userip_q_delay %delay
  6717. 6717 if (%batch != $null) set %barna_userip_q_batch_max %batch
  6718. 6718 if (%batchdelay != $null) set %barna_userip_q_batch_delay %batchdelay
  6719. 6719 if (%turbo_th != $null) set %barna_userip_turbo_threshold %turbo_th
  6720. 6720 if (%turbo_batch != $null) set %barna_userip_turbo_batch_max %turbo_batch
  6721. 6721 if (%turbo_delay != $null) set %barna_userip_turbo_delay %turbo_delay
  6722. 6722 if (%emerg_th != $null) set %barna_userip_emergency_threshold %emerg_th
  6723. 6723 if (%emerg_batch != $null) set %barna_userip_emergency_batch_max %emerg_batch
  6724. 6724 if (%emerg_delay != $null) set %barna_userip_emergency_delay %emerg_delay
  6725. 6725 if (%maxp != $null) set %barna_userip_q_max_pending %maxp
  6726. 6726 if (%shedto != $null) set %barna_userip_q_shed_to %shedto
  6727. 6727 if (%drop != $null) set %barna_userip_drop_count %drop
  6728. 6728 if (%ttl != $null) set %barna_userip_state_ttl %ttl
  6729. 6729 if (%maxin != $null) set %barna_userip_max_inflight %maxin
  6730. 6730
  6731. 6731 _barna_dbg HIGIENE USERIP trim idle: antes= %before despues= $var(%barna_userip_*,0)
  6732. 6732 return 1
  6733. 6733}
  6734. 6734
  6735. 6735
  6736. 6736alias _barna_saquit_compact_vars {
  6737. 6737 _barna_runtime_defaults
  6738. 6738
  6739. 6739 var %before = $var(%barna_saquit*,0)
  6740. 6740 if (%before <= 0) return 0
  6741. 6741
  6742. 6742 if ($hget(barna_saquit_keep)) hfree barna_saquit_keep
  6743. 6743 hmake barna_saquit_keep 500
  6744. 6744
  6745. 6745 var %head = %barna_saquit_q_head
  6746. 6746 var %tail = %barna_saquit_q_tail
  6747. 6747 var %i
  6748. 6748 var %newtail = 0
  6749. 6749
  6750. 6750 if (%head !isnum 1-) var %head = 1
  6751. 6751 if (%tail !isnum 1-) var %tail = 0
  6752. 6752
  6753. 6753 var %i = %head
  6754. 6754 while (%i <= %tail) {
  6755. 6755 var %nick = [ [ $+(%,barna_saquit_q_item.,%i) ] ]
  6756. 6756 var %due = [ [ $+(%,barna_saquit_q_due.,%i) ] ]
  6757. 6757
  6758. 6758 if ((%nick != $null) && (%due != $null)) {
  6759. 6759 inc %newtail
  6760. 6760 var %ln = $lower(%nick)
  6761. 6761 hadd -m barna_saquit_keep $+(item.,%newtail) %nick
  6762. 6762 hadd -m barna_saquit_keep $+(due.,%newtail) %due
  6763. 6763 hadd -m barna_saquit_keep $+(slot.,%ln) %newtail
  6764. 6764 hadd -m barna_saquit_keep $+(pending.,%ln) 1
  6765. 6765
  6766. 6766 var %ip = [ [ $+(%,barna_saquit_ip.,%ln) ] ]
  6767. 6767 var %chans = [ [ $+(%,barna_saquit_chans.,%ln) ] ]
  6768. 6768 var %msg = [ [ $+(%,barna_saquit_msg.,%ln) ] ]
  6769. 6769 var %show = [ [ $+(%,barna_saquit_showchans.,%ln) ] ]
  6770. 6770
  6771. 6771 if (%ip != $null) hadd -m barna_saquit_keep $+(ip.,%ln) %ip
  6772. 6772 if (%chans != $null) hadd -m barna_saquit_keep $+(chans.,%ln) %chans
  6773. 6773 if (%msg != $null) hadd -m barna_saquit_keep $+(msg.,%ln) %msg
  6774. 6774 if (%show != $null) hadd -m barna_saquit_keep $+(show.,%ln) %show
  6775. 6775 }
  6776. 6776
  6777. 6777 inc %i
  6778. 6778 }
  6779. 6779
  6780. 6780 var %sv = $var(%barna_saquit_sent.*,0)
  6781. 6781 while (%sv > 0) {
  6782. 6782 var %vname = $var(%barna_saquit_sent.*,%sv)
  6783. 6783 var %ln2 = $gettok(%vname,2-,46)
  6784. 6784
  6785. 6785 if (%ln2 != $null) {
  6786. 6786 var %sentv = [ [ %vname ] ]
  6787. 6787 if (%sentv != $null) {
  6788. 6788 hadd -m barna_saquit_keep $+(sent.,%ln2) %sentv
  6789. 6789
  6790. 6790 var %ip2 = [ [ $+(%,barna_saquit_ip.,%ln2) ] ]
  6791. 6791 var %chans2 = [ [ $+(%,barna_saquit_chans.,%ln2) ] ]
  6792. 6792 var %msg2 = [ [ $+(%,barna_saquit_msg.,%ln2) ] ]
  6793. 6793 var %show2 = [ [ $+(%,barna_saquit_showchans.,%ln2) ] ]
  6794. 6794
  6795. 6795 if (%ip2 != $null) hadd -m barna_saquit_keep $+(ip.,%ln2) %ip2
  6796. 6796 if (%chans2 != $null) hadd -m barna_saquit_keep $+(chans.,%ln2) %chans2
  6797. 6797 if (%msg2 != $null) hadd -m barna_saquit_keep $+(msg.,%ln2) %msg2
  6798. 6798 if (%show2 != $null) hadd -m barna_saquit_keep $+(show.,%ln2) %show2
  6799. 6799 }
  6800. 6800 }
  6801. 6801
  6802. 6802 dec %sv
  6803. 6803 }
  6804. 6804
  6805. 6805 unset %barna_saquit_ip.*
  6806. 6806 unset %barna_saquit_chans.*
  6807. 6807 unset %barna_saquit_pending.*
  6808. 6808 unset %barna_saquit_timer.*
  6809. 6809 unset %barna_saquit_msg.*
  6810. 6810 unset %barna_saquit_showchans.*
  6811. 6811 unset %barna_saquit_sent.*
  6812. 6812 unset %barna_saquit_q_*
  6813. 6813 unset %barna_saquitq_*
  6814. 6814
  6815. 6815 if (%newtail > 0) {
  6816. 6816 set %barna_saquit_q_head 1
  6817. 6817 set %barna_saquit_q_tail %newtail
  6818. 6818 set %barna_saquit_q_count_real %newtail
  6819. 6819
  6820. 6820 var %r = 1
  6821. 6821 while (%r <= %newtail) {
  6822. 6822 var %rnick = $hget(barna_saquit_keep,$+(item.,%r))
  6823. 6823 var %rdue = $hget(barna_saquit_keep,$+(due.,%r))
  6824. 6824 var %rln = $lower(%rnick)
  6825. 6825
  6826. 6826 if ((%rnick != $null) && (%rdue != $null)) {
  6827. 6827 set -u600 %barna_saquit_q_item. $+ %r %rnick
  6828. 6828 set -u600 %barna_saquit_q_due. $+ %r %rdue
  6829. 6829 set -u600 %barna_saquit_q_slot. $+ %rln %r
  6830. 6830 set -u600 %barna_saquit_pending. $+ %rln 1
  6831. 6831 }
  6832. 6832
  6833. 6833 inc %r
  6834. 6834 }
  6835. 6835 }
  6836. 6836
  6837. 6837 var %all = $hget(barna_saquit_keep,0).item
  6838. 6838 var %di = 1
  6839. 6839 while (%di <= %all) {
  6840. 6840 var %key = $hget(barna_saquit_keep,%di).item
  6841. 6841
  6842. 6842 if ($left(%key,3) == ip.) {
  6843. 6843 var %ln3 = $right(%key,-3)
  6844. 6844 set -u600 %barna_saquit_ip. $+ %ln3 $hget(barna_saquit_keep,%key)
  6845. 6845 }
  6846. 6846 elseif ($left(%key,6) == chans.) {
  6847. 6847 var %ln4 = $right(%key,-6)
  6848. 6848 set -u600 %barna_saquit_chans. $+ %ln4 $hget(barna_saquit_keep,%key)
  6849. 6849 }
  6850. 6850 elseif ($left(%key,4) == msg.) {
  6851. 6851 var %ln5 = $right(%key,-4)
  6852. 6852 set -u600 %barna_saquit_msg. $+ %ln5 $hget(barna_saquit_keep,%key)
  6853. 6853 }
  6854. 6854 elseif ($left(%key,5) == show.) {
  6855. 6855 var %ln6 = $right(%key,-5)
  6856. 6856 set -u600 %barna_saquit_showchans. $+ %ln6 $hget(barna_saquit_keep,%key)
  6857. 6857 }
  6858. 6858 elseif ($left(%key,5) == sent.) {
  6859. 6859 var %ln7 = $right(%key,-5)
  6860. 6860 set -u300 %barna_saquit_sent. $+ %ln7 $hget(barna_saquit_keep,%key)
  6861. 6861 }
  6862. 6862
  6863. 6863 inc %di
  6864. 6864 }
  6865. 6865
  6866. 6866 if ($hget(barna_saquit_keep)) hfree barna_saquit_keep
  6867. 6867
  6868. 6868 if ($_barna_saquit_q_count > 0) _barna_saquit_q_start
  6869. 6869 else _barna_saquit_q_compact_if_empty
  6870. 6870
  6871. 6871 var %after = $var(%barna_saquit*,0)
  6872. 6872 if (%before > %after) {
  6873. 6873 _barna_dbg HIGIENE SAQUIT compactado: antes= %before despues= %after cola= $_barna_saquit_q_count
  6874. 6874 return 1
  6875. 6875 }
  6876. 6876
  6877. 6877 return 0
  6878. 6878}
  6879. 6879
  6880. 6880
  6881. 6881; ------------------------------------------------------------
  6882. 6882; BLOQUE 8.7B
  6883. 6883; LAGRELIEF / GC PESADO CONTROLADO
  6884. 6884; ------------------------------------------------------------
  6885. 6885
  6886. 6886alias _barna_heavy_gc_tick {
  6887. 6887 if (%barna_addon != 1) return
  6888. 6888 if (%barna_heavy_gc_busy == 1) return
  6889. 6889
  6890. 6890 var %now = $ctime
  6891. 6891 var %secs = %barna_heavy_gc_secs
  6892. 6892 if (%secs !isnum 10-) var %secs = 20
  6893. 6893
  6894. 6894 if (%barna_heavy_gc_last != $null) {
  6895. 6895 if ($calc(%now - %barna_heavy_gc_last) < %secs) return
  6896. 6896 }
  6897. 6897
  6898. 6898 set -u30 %barna_heavy_gc_busy 1
  6899. 6899 set %barna_heavy_gc_last %now
  6900. 6900 noop $_barna_heavy_gc_run(auto)
  6901. 6901}
  6902. 6902
  6903. 6903alias barna.lagclean {
  6904. 6904 var %r = $_barna_heavy_gc_run(manual)
  6905. 6905 echo -s [ASN] LAGCLEAN ejecutado. acciones= %r highflow= %barna_highflow_gc total= $var(%barna_*,0) totalmax= %barna_total_max_vars q= $var(%barna_q_*,0) userip= $var(%barna_userip_*,0) lookup= $var(%barna_lookup.*,0) lookup_chans= $var(%barna_lookup_chans.*,0) last_ip= $var(%barna_last_ip.*,0) ip_keep= $var(%barna_ip_keep.*,0) qry= $var(%barna_qry.*,0) ipdone= $var(%barna_ipdone.*,0) badpfx2= $var(%barna_badpfx2.*,0) badpfx3= $var(%barna_badpfx3.*,0) badnick= $var(%barna_badnick.*,0) badnick_ip= $var(%barna_badnick_ip.*,0) badnick_chans= $var(%barna_badnick_chans.*,0) sock= $var(%barna_sock_*,0) sockdot= $var(%barna_sock.*,0) rx= $var(%barna_rx.*,0) asn_done= $var(%barna_asn_done.*,0) seen= $var(%barna_seen.*,0) jguard= $var(%barna_jguard*,0) seenguard= $var(%barna_seen_rescue_recent.*,0) saquit= $var(%barna_saquit*,0)
  6906. 6906}
  6907. 6907
  6908. 6908alias barna.lookclean {
  6909. 6909 unset %barna_lookup.*
  6910. 6910 unset %barna_lookup_chans.*
  6911. 6911 unset %barna_lookup_timer.*
  6912. 6912 unset %barna_qry.*
  6913. 6913 unset %barna_ipdone.*
  6914. 6914 unset %barna_last_ip.*
  6915. 6915 echo -s [ASN] LOOKCLEAN ejecutado. Limpieza de lookup/last_ip sin tocar canales/ASN ni ip_keep.
  6916. 6916}
  6917. 6917
  6918. 6918alias _barna_ipkeep_safe_look_gc {
  6919. 6919 ; Build 52: limpieza automatica de lookup/last_ip cuando USERIP esta idle.
  6920. 6920 ; Mantiene %barna_ip_keep.* para debug, trace y Parseline2.
  6921. 6921 if ($_barna_userip_q_count > 0) return 0
  6922. 6922 if ($timer(BarnaUserIPBatch) != $null) return 0
  6923. 6923
  6924. 6924 var %lookup = $var(%barna_lookup.*,0)
  6925. 6925 var %lookupchans = $var(%barna_lookup_chans.*,0)
  6926. 6926 var %lastip = $var(%barna_last_ip.*,0)
  6927. 6927 var %qry = $var(%barna_qry.*,0)
  6928. 6928 var %ipdone = $var(%barna_ipdone.*,0)
  6929. 6929 var %total = $calc(%lookup + %lookupchans + %lastip + %qry + %ipdone)
  6930. 6930 var %max = %barna_lookup_idle_total_max
  6931. 6931 if (%max !isnum 50-) var %max = 200
  6932. 6932
  6933. 6933 if (%total > %max) {
  6934. 6934 unset %barna_lookup.*
  6935. 6935 unset %barna_lookup_chans.*
  6936. 6936 unset %barna_lookup_timer.*
  6937. 6937 unset %barna_qry.*
  6938. 6938 unset %barna_ipdone.*
  6939. 6939 unset %barna_last_ip.*
  6940. 6940 return 1
  6941. 6941 }
  6942. 6942
  6943. 6943 return 0
  6944. 6944}
  6945. 6945
  6946. 6946alias barna.badnickclean {
  6947. 6947 unset %barna_badnick.*
  6948. 6948 unset %barna_badnick_ip.*
  6949. 6949 unset %barna_badnick_chans.*
  6950. 6950 echo -s [ASN] BADNICKCLEAN ejecutado. Limpieza de badnick temporal por canal sin tocar canales/ASN.
  6951. 6951}
  6952. 6952
  6953. 6953alias _barna_heavy_gc_run {
  6954. 6954 _barna_runtime_defaults
  6955. 6955
  6956. 6956 var %mode = $1
  6957. 6957 var %actions = 0
  6958. 6958
  6959. 6959 ; Nunca tocar aqui %barna_chan.* ni %barna_asn.*.
  6960. 6960
  6961. 6961 var %p2 = $var(%barna_badpfx2.*,0)
  6962. 6962 var %p3 = $var(%barna_badpfx3.*,0)
  6963. 6963 var %p2max = %barna_badpfx2_max_vars
  6964. 6964 var %p3max = %barna_badpfx3_max_vars
  6965. 6965 if (%p2max !isnum 10-) var %p2max = 40
  6966. 6966 if (%p3max !isnum 20-) var %p3max = 80
  6967. 6967
  6968. 6968 if ((%p2 > %p2max) || (%p3 > %p3max)) {
  6969. 6969 unset %barna_badpfx2.*
  6970. 6970 unset %barna_badpfx3.*
  6971. 6971 inc %actions
  6972. 6972 if (%mode == manual) echo -s [ASN] LAGCLEAN badpfx limpiado: pfx2= %p2 pfx3= %p3
  6973. 6973 }
  6974. 6974
  6975. 6975 var %seen = $var(%barna_seen.*,0)
  6976. 6976 var %seenmax = %barna_seen_max_vars
  6977. 6977 if (%seenmax !isnum 100-) var %seenmax = 700
  6978. 6978
  6979. 6979 if (%seen > %seenmax) {
  6980. 6980 unset %barna_seen.*
  6981. 6981 inc %actions
  6982. 6982 if (%mode == manual) echo -s [ASN] LAGCLEAN seen limpiado: seen= %seen max= %seenmax
  6983. 6983 }
  6984. 6984
  6985. 6985 var %echoseen = $var(%barna_echo_seen.*,0)
  6986. 6986 var %echomax = %barna_echo_seen_max_vars
  6987. 6987 if (%echomax !isnum 100-) var %echomax = 400
  6988. 6988
  6989. 6989 if (%echoseen > %echomax) {
  6990. 6990 unset %barna_echo_seen.*
  6991. 6991 inc %actions
  6992. 6992 if (%mode == manual) echo -s [ASN] LAGCLEAN echo_seen limpiado: vars= %echoseen
  6993. 6993 }
  6994. 6994
  6995. 6995 ; Build 92: dedupe ASN/case/SEENGUARD tambien son temporales.
  6996. 6996 var %echoasn = $var(%barna_echo_asn_seen.*,0)
  6997. 6997 var %echoasnmax = %barna_echo_asn_seen_max_vars
  6998. 6998 if (%echoasnmax !isnum 20-) var %echoasnmax = 80
  6999. 6999 if (%echoasn > %echoasnmax) {
  7000. 7000 unset %barna_echo_asn_seen.*
  7001. 7001 inc %actions
  7002. 7002 if (%mode == manual) echo -s [ASN] LAGCLEAN echo_asn_seen limpiado: vars= %echoasn max= %echoasnmax
  7003. 7003 }
  7004. 7004
  7005. 7005 var %displayv = $var(%barna_seen_display.*,0)
  7006. 7006 if (%displayv > %seenmax) {
  7007. 7007 unset %barna_seen_display.*
  7008. 7008 inc %actions
  7009. 7009 if (%mode == manual) echo -s [ASN] LAGCLEAN seen_display limpiado: vars= %displayv max= %seenmax
  7010. 7010 }
  7011. 7011
  7012. 7012 var %seengr = $var(%barna_seen_rescue_recent.*,0)
  7013. 7013 if (%seengr > 40) {
  7014. 7014 unset %barna_seen_rescue_recent.*
  7015. 7015 inc %actions
  7016. 7016 if (%mode == manual) echo -s [ASN] LAGCLEAN seenguard_recent limpiado: vars= %seengr
  7017. 7017 }
  7018. 7018
  7019. 7019 ; VARHYGIENE49: badnick/badnick_ip/badnick_chans es memoria temporal por canal.
  7020. 7020 var %bn = $var(%barna_badnick.*,0)
  7021. 7021 var %bnip = $var(%barna_badnick_ip.*,0)
  7022. 7022 var %bnch = $var(%barna_badnick_chans.*,0)
  7023. 7023 var %bnmax = %barna_badnick_max_vars
  7024. 7024 if (%bnmax !isnum 50-) var %bnmax = 300
  7025. 7025
  7026. 7026 if ($calc(%bn + %bnip + %bnch) > %bnmax) {
  7027. 7027 unset %barna_badnick.*
  7028. 7028 unset %barna_badnick_ip.*
  7029. 7029 unset %barna_badnick_chans.*
  7030. 7030 inc %actions
  7031. 7031 if (%mode == manual) echo -s [ASN] LAGCLEAN badnick limpiado: badnick= %bn badnick_ip= %bnip badnick_chans= %bnch max= %bnmax
  7032. 7032 }
  7033. 7033
  7034. 7034 ; Build 51: ip_keep conserva IPs para trazas y Parseline2 aunque se limpie last_ip.
  7035. 7035 ; Es temporal y acotado para evitar volver al lag por variables masivas.
  7036. 7036 var %ipkeep = $var(%barna_ip_keep.*,0)
  7037. 7037 var %ipkeepmax = %barna_ip_keep_max_vars
  7038. 7038 if (%ipkeepmax !isnum 100-) var %ipkeepmax = 700
  7039. 7039 if (%ipkeepmax > 700) var %ipkeepmax = 700
  7040. 7040 if (%ipkeep > %ipkeepmax) {
  7041. 7041 unset %barna_ip_keep.*
  7042. 7042 inc %actions
  7043. 7043 if (%mode == manual) echo -s [ASN] LAGCLEAN ip_keep limpiado por limite: ip_keep= %ipkeep max= %ipkeepmax
  7044. 7044 }
  7045. 7045
  7046. 7046 ; VARHYGIENE37: las familias lookup/last_ip crecen mucho con joins masivos.
  7047. 7047 ; Son estado temporal; no contienen configuracion de canales ni ASN.
  7048. 7048 var %lookup = $var(%barna_lookup.*,0)
  7049. 7049 var %lookupchans = $var(%barna_lookup_chans.*,0)
  7050. 7050 var %lastip = $var(%barna_last_ip.*,0)
  7051. 7051 var %qry = $var(%barna_qry.*,0)
  7052. 7052 var %ipdone = $var(%barna_ipdone.*,0)
  7053. 7053 var %lookuptotal = $calc(%lookup + %lookupchans + %lastip + %qry + %ipdone)
  7054. 7054 var %lookupmax = %barna_lookup_max_vars
  7055. 7055 var %lastipmax = %barna_lastip_max_vars
  7056. 7056 var %lookuptotalmax = %barna_lookup_total_max_vars
  7057. 7057 if (%lookupmax !isnum 100-) var %lookupmax = 400
  7058. 7058 if (%lastipmax !isnum 100-) var %lastipmax = 400
  7059. 7059 if (%lookuptotalmax !isnum 300-) var %lookuptotalmax = 900
  7060. 7060
  7061. 7061 if ((%lookup > %lookupmax) || (%lookupchans > %lookupmax) || (%lastip > %lastipmax) || (%lookuptotal > %lookuptotalmax)) {
  7062. 7062 unset %barna_lookup.*
  7063. 7063 unset %barna_lookup_chans.*
  7064. 7064 unset %barna_lookup_timer.*
  7065. 7065 unset %barna_qry.*
  7066. 7066 unset %barna_ipdone.*
  7067. 7067 unset %barna_last_ip.*
  7068. 7068 inc %actions
  7069. 7069 if (%mode == manual) echo -s [ASN] LAGCLEAN lookup/last_ip limpiado: lookup= %lookup lookup_chans= %lookupchans last_ip= %lastip qry= %qry ipdone= %ipdone total_lookup= %lookuptotal
  7070. 7070 }
  7071. 7071
  7072. 7072 ; VARHYGIENE43: restos de sockets ASN antiguos. Son estado temporal.
  7073. 7073 ; Solo se purgan si no hay sockets reales ni running ASN.
  7074. 7074 var %sockvars = $_barna_sockvar_count
  7075. 7075 var %sockmax = %barna_sockvar_max_vars
  7076. 7076 if (%sockmax !isnum 50-) var %sockmax = 150
  7077. 7077 if (%sockvars > %sockmax) {
  7078. 7078 var %cleaned_sockvars = $_barna_sockvar_gc
  7079. 7079 if (%cleaned_sockvars > 0) {
  7080. 7080 inc %actions
  7081. 7081 if (%mode == manual) echo -s [ASN] LAGCLEAN sock/rx/asn_done limpiado: vars= %cleaned_sockvars max= %sockmax
  7082. 7082 }
  7083. 7083 }
  7084. 7084
  7085. 7085 var %sqv = $var(%barna_saquit*,0)
  7086. 7086 var %sqc = $_barna_saquit_q_count
  7087. 7087 var %sqvmax = %barna_saquit_emergency_max_vars
  7088. 7088 var %sqcmax = %barna_saquit_emergency_max_queue
  7089. 7089 if (%sqvmax !isnum 100-) var %sqvmax = 300
  7090. 7090 if (%sqcmax !isnum 10-) var %sqcmax = 50
  7091. 7091
  7092. 7092 if ((%sqv > %sqvmax) || (%sqc > %sqcmax)) {
  7093. 7093 .timerBarnaSAQUITPump off
  7094. 7094 unset %barna_saquit_ip.*
  7095. 7095 unset %barna_saquit_chans.*
  7096. 7096 unset %barna_saquit_pending.*
  7097. 7097 unset %barna_saquit_timer.*
  7098. 7098 unset %barna_saquit_sent.*
  7099. 7099 unset %barna_saquit_msg.*
  7100. 7100 unset %barna_saquit_showchans.*
  7101. 7101 unset %barna_saquit_q_*
  7102. 7102 unset %barna_saquitq_*
  7103. 7103 inc %actions
  7104. 7104 echo -s [ASN] LAGCLEAN SAQUIT emergencia: se purga cola pesada. vars= %sqv cola= %sqc
  7105. 7105 }
  7106. 7106
  7107. 7107 var %uv = $var(%barna_userip_*,0)
  7108. 7108 var %uq = $_barna_userip_q_count
  7109. 7109 if ((%uv > 80) && (%uq <= 5)) {
  7110. 7110 noop $_barna_userip_vartrim_idle
  7111. 7111 inc %actions
  7112. 7112 }
  7113. 7113
  7114. 7114 var %qv = $var(%barna_q_*,0)
  7115. 7115 var %liveq = $calc($numtok(%barna_q_items,44) + $numtok(%barna_q_low_items,44))
  7116. 7116 if ((%qv > 40) && (%liveq == 0) && (%barna_q_running == 0) && ($_barna_ipinfo_sock_count == 0)) {
  7117. 7117 unset %barna_q_*
  7118. 7118 _barna_runtime_defaults
  7119. 7119 inc %actions
  7120. 7120 }
  7121. 7121
  7122. 7122 if ($var(%barna*joinfix*,0) > 40) {
  7123. 7123 barna.joinfixgc.run
  7124. 7124 inc %actions
  7125. 7125 }
  7126. 7126
  7127. 7127 var %jgv = $var(%barna_jguard*,0)
  7128. 7128 var %jgmax = %barna_join_guard_max
  7129. 7129 if (%jgmax !isnum 20-) var %jgmax = 60
  7130. 7130 if (%jgv > $calc(%jgmax * 4)) {
  7131. 7131 _barna_join_guard_gc
  7132. 7132 inc %actions
  7133. 7133 }
  7134. 7134
  7135. 7135 var %total = $var(%barna_*,0)
  7136. 7136 var %totalmax = %barna_total_max_vars
  7137. 7137 if (%totalmax !isnum 1000-) var %totalmax = 2500
  7138. 7138 if (%total > %totalmax) {
  7139. 7139 if ($var(%barna_badpfx2.*,0) > 0) unset %barna_badpfx2.*
  7140. 7140 if ($var(%barna_badpfx3.*,0) > 0) unset %barna_badpfx3.*
  7141. 7141 if ($var(%barna_seen.*,0) > 0) unset %barna_seen.*
  7142. 7142 if ($var(%barna_echo_seen.*,0) > 0) unset %barna_echo_seen.*
  7143. 7143 if ($var(%barna_echo_asn_seen.*,0) > 0) unset %barna_echo_asn_seen.*
  7144. 7144 if ($var(%barna_seen_display.*,0) > 0) unset %barna_seen_display.*
  7145. 7145 if ($var(%barna_seen_rescue_recent.*,0) > 0) unset %barna_seen_rescue_recent.*
  7146. 7146 if ($var(%barna_badnick.*,0) > 0) unset %barna_badnick.*
  7147. 7147 if ($var(%barna_badnick_ip.*,0) > 0) unset %barna_badnick_ip.*
  7148. 7148 if ($var(%barna_badnick_chans.*,0) > 0) unset %barna_badnick_chans.*
  7149. 7149 if ($var(%barna_lookup.*,0) > 0) unset %barna_lookup.*
  7150. 7150 if ($var(%barna_lookup_chans.*,0) > 0) unset %barna_lookup_chans.*
  7151. 7151 if ($var(%barna_lookup_timer.*,0) > 0) unset %barna_lookup_timer.*
  7152. 7152 if ($var(%barna_qry.*,0) > 0) unset %barna_qry.*
  7153. 7153 if ($var(%barna_ipdone.*,0) > 0) unset %barna_ipdone.*
  7154. 7154 if ($var(%barna_last_ip.*,0) > 0) unset %barna_last_ip.*
  7155. 7155 if ($var(%barna_jguard*,0) > 0) {
  7156. 7156 unset %barna_jguard_items
  7157. 7157 unset %barna_jguard.*
  7158. 7158 unset %barna_jguard_ts.*
  7159. 7159 unset %barna_jguard_nick.*
  7160. 7160 }
  7161. 7161 if (($_barna_ipinfo_sock_count == 0) && (%barna_q_running <= 0)) {
  7162. 7162 noop $_barna_sockvar_gc
  7163. 7163 }
  7164. 7164 inc %actions
  7165. 7165 echo -s [ASN] LAGCLEAN total alto: purga extra sin tocar canales/ASN. total= %total
  7166. 7166 }
  7167. 7167
  7168. 7168 return %actions
  7169. 7169}
  7170. 7170
  7171. 7171; ------------------------------------------------------------
  7172. 7172; BLOQUE 8.8
  7173. 7173; HIGIENE DE VARIABLES PARA EVITAR LAG ACUMULATIVO
  7174. 7174; ------------------------------------------------------------
  7175. 7175
  7176. 7176alias _barna_hygiene_tick {
  7177. 7177 var %now = $ctime
  7178. 7178 var %secs = %barna_hygiene_secs
  7179. 7179
  7180. 7180 if (%secs !isnum 60-) var %secs = 300
  7181. 7181 if (%barna_hygiene_busy == 1) return
  7182. 7182
  7183. 7183 if (%barna_hygiene_last != $null) {
  7184. 7184 if ($calc(%now - %barna_hygiene_last) < %secs) return
  7185. 7185 }
  7186. 7186
  7187. 7187 set -u30 %barna_hygiene_busy 1
  7188. 7188 set %barna_hygiene_last %now
  7189. 7189
  7190. 7190 var %cachemax = %barna_asn_cache_max_exact
  7191. 7191 if (%cachemax !isnum 50-) var %cachemax = 120
  7192. 7192
  7193. 7193 if ($var(%barna_asn_cache_asn.*,0) > %cachemax) {
  7194. 7194 _barna_dbg HIGIENE cache ASN exacta excede limite, limpiando silenciosamente: actual= $var(%barna_asn_cache_asn.*,0) max= %cachemax
  7195. 7195 barna.cachereset silent
  7196. 7196 }
  7197. 7197
  7198. 7198 ; Build 92: temporales de dedupe/trace tienen cap bajo para no crear lag acumulado.
  7199. 7199 var %echoasn_h = $var(%barna_echo_asn_seen.*,0)
  7200. 7200 var %echoasnmax_h = %barna_echo_asn_seen_max_vars
  7201. 7201 if (%echoasnmax_h !isnum 20-) var %echoasnmax_h = 80
  7202. 7202 if (%echoasn_h > %echoasnmax_h) unset %barna_echo_asn_seen.*
  7203. 7203
  7204. 7204 if ($var(%barna_echo_seen.*,0) > %barna_echo_seen_max_vars) unset %barna_echo_seen.*
  7205. 7205 if ($var(%barna_seen_rescue_recent.*,0) > 40) unset %barna_seen_rescue_recent.*
  7206. 7206
  7207. 7207 var %qv = $var(%barna_q_*,0)
  7208. 7208 var %liveq = $calc($numtok(%barna_q_items,44) + $numtok(%barna_q_low_items,44))
  7209. 7209
  7210. 7210 ; VARHYGIENE12: si no hay cola ASN real, primero purga total idle.
  7211. 7211 if (!$_barna_q_idle_gc) {
  7212. 7212 var %qallow = $calc((%liveq * 10) + 40)
  7213. 7213 var %qmaxa = %barna_q_var_max_active
  7214. 7214 if (%qmaxa !isnum 50-) var %qmaxa = 120
  7215. 7215 if (%qallow > %qmaxa) var %qallow = %qmaxa
  7216. 7216
  7217. 7217 if (%qv > %qallow) {
  7218. 7218 noop $_barna_q_compact_vars
  7219. 7219 }
  7220. 7220 }
  7221. 7221
  7222. 7222 var %uv = $var(%barna_userip_*,0)
  7223. 7223 var %uq = $_barna_userip_q_count
  7224. 7224 var %umax = %barna_userip_var_max_idle
  7225. 7225 if (%umax !isnum 50-) var %umax = 80
  7226. 7226
  7227. 7227 ; VARHYGIENE5: limpia USERIP tambien con pocos pendientes reales.
  7228. 7228 if ((%uv > %umax) && (%uq <= 20)) {
  7229. 7229 noop $_barna_userip_vartrim_idle
  7230. 7230 }
  7231. 7231
  7232. 7232 var %sv = $var(%barna_saquit*,0)
  7233. 7233 var %lives = $_barna_saquit_q_count
  7234. 7234 var %sallow = $calc((%lives * 12) + 40)
  7235. 7235 var %smax = %barna_saquit_var_max_idle
  7236. 7236 if (%smax !isnum 50-) var %smax = 80
  7237. 7237 if (%sallow > %smax) var %sallow = %smax
  7238. 7238
  7239. 7239 if (%sv > %sallow) {
  7240. 7240 noop $_barna_saquit_compact_vars
  7241. 7241 }
  7242. 7242
  7243. 7243 unset %barna_hygiene_busy
  7244. 7244}
  7245. 7245
  7246. 7246
  7247. 7247; ------------------------------------------------------------
  7248. 7248; BLOQUE 8.8.5
  7249. 7249; ARRANQUE ASN DIRECTO DE RESCATE
  7250. 7250; ------------------------------------------------------------
  7251. 7251
  7252. 7252
  7253. 7253alias _barna_asn_first_id {
  7254. 7254 if (%barna_q_items != $null) return $gettok(%barna_q_items,1,44)
  7255. 7255 if (%barna_q_low_items != $null) return $gettok(%barna_q_low_items,1,44)
  7256. 7256}
  7257. 7257
  7258. 7258alias _barna_asn_first_nick {
  7259. 7259 var %id = $_barna_asn_first_id
  7260. 7260 if (%id == $null) return
  7261. 7261 return [ [ $+(%,barna_q_nick.,%id) ] ]
  7262. 7262}
  7263. 7263
  7264. 7264alias _barna_asn_first_ip {
  7265. 7265 var %id = $_barna_asn_first_id
  7266. 7266 if (%id == $null) return
  7267. 7267 return [ [ $+(%,barna_q_ip.,%id) ] ]
  7268. 7268}
  7269. 7269
  7270. 7270alias _barna_asn_queue_has_items {
  7271. 7271 if (%barna_q_items != $null) return 1
  7272. 7272 if (%barna_q_low_items != $null) return 1
  7273. 7273 return 0
  7274. 7274}
  7275. 7275
  7276. 7276alias _barna_asn_direct_start_one {
  7277. 7277 if (%barna_addon != 1) return 0
  7278. 7278
  7279. 7279 ; VARHYGIENE11 FAILFAST:
  7280. 7280 ; Motor directo de ASN. No depende de q_process ni de qbusy.
  7281. 7281 ; Extrae hasta 40 IDs, descarta inválidos, y abre un socket real con nombre simple ipinfo<ID>.
  7282. 7282 _barna_q_clear_ghost_light
  7283. 7283
  7284. 7284 var %running = %barna_q_running
  7285. 7285 if (%running == $null) var %running = 0
  7286. 7286 if (%running > 0) return 0
  7287. 7287
  7288. 7288 var %id
  7289. 7289 var %lowmode = 0
  7290. 7290 var %tries = 0
  7291. 7291
  7292. 7292 while (%tries < 40) {
  7293. 7293 inc %tries
  7294. 7294
  7295. 7295 if (%barna_q_items != $null) {
  7296. 7296 %id = $gettok(%barna_q_items,1,44)
  7297. 7297 var %newitems = $remtok(%barna_q_items,%id,1,44)
  7298. 7298 %lowmode = 0
  7299. 7299
  7300. 7300 if (%newitems == $null) unset %barna_q_items
  7301. 7301 else set %barna_q_items %newitems
  7302. 7302 }
  7303. 7303 else {
  7304. 7304 if (%barna_q_low_items != $null) {
  7305. 7305 %id = $gettok(%barna_q_low_items,1,44)
  7306. 7306 var %newlowitems = $remtok(%barna_q_low_items,%id,1,44)
  7307. 7307 %lowmode = 1
  7308. 7308
  7309. 7309 if (%newlowitems == $null) unset %barna_q_low_items
  7310. 7310 else set %barna_q_low_items %newlowitems
  7311. 7311 }
  7312. 7312 else return 0
  7313. 7313 }
  7314. 7314
  7315. 7315 if (%id == $null) return 0
  7316. 7316
  7317. 7317 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  7318. 7318 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  7319. 7319 var %chans = [ [ $+(%,barna_q_chans.,%id) ] ]
  7320. 7320
  7321. 7321 if ((%nick != $null) && (%ip != $null)) break
  7322. 7322
  7323. 7323 _barna_dbg DIRECTASN descarta ID invalido: id= %id nick= %nick ip= %ip
  7324. 7324 _barna_q_remove %id
  7325. 7325 %id = $null
  7326. 7326 }
  7327. 7327
  7328. 7328 if (%id == $null) return 0
  7329. 7329
  7330. 7330 var %ln = $lower(%nick)
  7331. 7331 unset %barna_q_pending. $+ %ln
  7332. 7332 set -u120 %barna_q_active. $+ %ln %id
  7333. 7333
  7334. 7334 var %try = [ [ $+(%,barna_q_try.,%id) ] ]
  7335. 7335 if (%try == $null) var %try = 0
  7336. 7336 inc %try
  7337. 7337 set -u180 %barna_q_try. $+ %id %try
  7338. 7338
  7339. 7339 set -u90 %temp_ip_ $+ %nick %ip
  7340. 7340 unset %asn_val. $+ %nick
  7341. 7341 unset %as_name_val. $+ %nick
  7342. 7342 unset %barna_asn_done. $+ %ln
  7343. 7343 unset %barna_sock_timeout_seen. $+ %ln
  7344. 7344 set -u30 %barna_rx. $+ %ln 0
  7345. 7345
  7346. 7346 var %sock_name = $_barna_sock_name(%nick,%id)
  7347. 7347
  7348. 7348 if ($sock(%sock_name)) sockclose %sock_name
  7349. 7349
  7350. 7350 set -u20 %barna_sock_nick. $+ %id %nick
  7351. 7351 set -u20 %barna_sock_ip. $+ %id %ip
  7352. 7352 set -u20 %barna_sock_id. $+ %id %id
  7353. 7353 set -u20 %barna_sock_expected. $+ %id %sock_name
  7354. 7354 unset %barna_sock_opened. $+ %id
  7355. 7355
  7356. 7356 _barna_q_running_inc
  7357. 7357 set -u60 %barna_q_last_start_ts $ctime
  7358. 7358 set -u60 %barna_q_last_start_id %id
  7359. 7359 set -u60 %barna_q_last_start_sock %sock_name
  7360. 7360
  7361. 7361 if (%lowmode == 1) {
  7362. 7362 _barna_dbg DIRECTASN baja abre socket: id= %id try= %try nick= %nick ip= %ip sock= %sock_name normal_total= $numtok(%barna_q_items,44) low_total= $numtok(%barna_q_low_items,44)
  7363. 7363 }
  7364. 7364 else {
  7365. 7365 _barna_dbg DIRECTASN abre socket: id= %id try= %try nick= %nick ip= %ip sock= %sock_name normal_total= $numtok(%barna_q_items,44) low_total= $numtok(%barna_q_low_items,44)
  7366. 7366 }
  7367. 7367
  7368. 7368 sockopen -e %sock_name api.ipinfo.io 443
  7369. 7369
  7370. 7370 ; VARHYGIENE19: si mIRC no crea el socket tras sockopen, no dejamos running fantasma.
  7371. 7371 if (!$sock(%sock_name)) {
  7372. 7372 _barna_dbg DIRECTASN sockopen sin socket visible: id= %id nick= %nick ip= %ip sock= %sock_name
  7373. 7373 _barna_q_retry_or_done %nick SOCKOPEN_NO_SOCKET
  7374. 7374 return 0
  7375. 7375 }
  7376. 7376
  7377. 7377 var %sockto = %barna_sock_timeout_secs
  7378. 7378 if (%sockto !isnum 5-) var %sockto = 10
  7379. 7379
  7380. 7380 var %totimer = BarnaSockTO_ $+ %id
  7381. 7381 set -u300 %barna_q_totimer. $+ %id %totimer
  7382. 7382 .timer $+ %totimer 1 %sockto _barna_sock_timeout %nick %sock_name %id
  7383. 7383
  7384. 7384 return 1
  7385. 7385}
  7386. 7386
  7387. 7387
  7388. 7388; ------------------------------------------------------------
  7389. 7389; BUILD 99: CAP DURO DE ESTADO POSTCONSULTA
  7390. 7390; ------------------------------------------------------------
  7391. 7391; ------------------------------------------------------------
  7392. 7392; BUILD 99: LIMPIEZA SELECTIVA DE COLA ASN TEMPORAL
  7393. 7393; ------------------------------------------------------------
  7394. 7394alias _barna_q_temp_clear {
  7395. 7395 ; No usar unset %barna_q_* porque borraria configuracion q_delay/q_workers/etc.
  7396. 7396 ; Solo limpia estado temporal de consultas ASN ya huerfano.
  7397. 7397 var %i = $timer(0)
  7398. 7398 while (%i > 0) {
  7399. 7399 var %t = $timer(%i)
  7400. 7400 var %lt = $lower(%t)
  7401. 7401 if (($left(%lt,12) == barnasockto_) || ($left(%lt,12) == barnaqretry_)) .timer $+ %t off
  7402. 7402 dec %i
  7403. 7403 }
  7404. 7404
  7405. 7405 .unset %barna_q_pending.*
  7406. 7406 .unset %barna_q_active.*
  7407. 7407 .unset %barna_q_state.*
  7408. 7408 .unset %barna_q_ip.*
  7409. 7409 .unset %barna_q_chans.*
  7410. 7410 .unset %barna_q_try.*
  7411. 7411 .unset %barna_q_nick.*
  7412. 7412 .unset %barna_q_ts.*
  7413. 7413 .unset %barna_q_low.*
  7414. 7414 .unset %barna_q_deferred.*
  7415. 7415 .unset %barna_q_retry_timer.*
  7416. 7416 .unset %barna_q_totimer.*
  7417. 7417 .unset %barna_q_finished.*
  7418. 7418 .unset %barna_q_items
  7419. 7419 .unset %barna_q_low_items
  7420. 7420 .unset %barna_q_running
  7421. 7421 .unset %barna_q_process_busy
  7422. 7422 .unset %barna_q_last_start_ts
  7423. 7423 .unset %barna_q_last_start_id
  7424. 7424 .unset %barna_q_last_start_sock
  7425. 7425 .unset %barna_q_scheduled
  7426. 7426 .unset %barna_q_prune_last
  7427. 7427
  7428. 7428 noop $_barna_sockto_orphan_gc
  7429. 7429 return 1
  7430. 7430}
  7431. 7431
  7432. 7432alias _barna_statecap_hardgc {
  7433. 7433 ; Limpieza fuerte pero acotada. No toca %barna_chan.* ni %barna_asn.*.
  7434. 7434 if (%barna_addon != 1) return 0
  7435. 7435 if (%barna_statecap_hard_busy == 1) return 0
  7436. 7436
  7437. 7437 set -u6 %barna_statecap_hard_busy 1
  7438. 7438
  7439. 7439 var %changed = 0
  7440. 7440 var %ucnt = $_barna_userip_q_count
  7441. 7441 var %infvars = $var(%barna_userip_inflight.*,0)
  7442. 7442 var %infcount = %barna_userip_inflight_count
  7443. 7443 var %cur = %barna_whoip_current_ln
  7444. 7444 var %curnick = %barna_whoip_current_nick
  7445. 7445
  7446. 7446 if (%infcount !isnum 1-) var %infcount = 0
  7447. 7447
  7448. 7448 ; DIRECT100: no purgar inflight activos mientras hay cola WHOIP real.
  7449. 7449 ; En esta red el RAW354 trae nick+IP, por lo que varios inflight son seguros para
  7450. 7450 ; aceptar respuestas; el build 99 los reducia a 1 y rompia el debug/ASN tras JOIN.
  7451. 7451 ; Solo limpiamos inflight si ya no hay cola WHOIP ni WHO actual, o si el crecimiento
  7452. 7452 ; es claramente patologico.
  7453. 7453 if (((%infvars > 0) && (%ucnt == 0) && (%cur == $null)) || (%infvars > 180)) {
  7454. 7454 .unset %barna_userip_inflight.*
  7455. 7455 .unset %barna_userip_inflight_count
  7456. 7456 .unset %barna_whoip_current_nick
  7457. 7457 .unset %barna_whoip_current_ln
  7458. 7458 .unset %barna_whoip_315_pending
  7459. 7459 .unset %barna_whoip_315_done_pending
  7460. 7460 inc %changed
  7461. 7461 }
  7462. 7462
  7463. 7463 ; Si la cola WHOIP real esta vacia y no hay WHO actual, limpia restos de cola/sent.
  7464. 7464 if (($_barna_userip_q_count == 0) && (%barna_whoip_current_ln == $null)) {
  7465. 7465 if ($var(%barna_userip_q_*,0) > 5) {
  7466. 7466 .unset %barna_userip_q_item.*
  7467. 7467 .unset %barna_userip_q_chans.*
  7468. 7468 .unset %barna_userip_q_pending.*
  7469. 7469 .unset %barna_userip_q_nick.*
  7470. 7470 .unset %barna_userip_q_slot.*
  7471. 7471 .unset %barna_userip_q_head
  7472. 7472 .unset %barna_userip_q_tail
  7473. 7473 .unset %barna_userip_q_count_real
  7474. 7474 .unset %barna_userip_q_scheduled
  7475. 7475 .unset %barna_userip_q_processing
  7476. 7476 inc %changed
  7477. 7477 }
  7478. 7478
  7479. 7479 .unset %barna_userip_sent_recent.*
  7480. 7480 .unset %barna_userip_sent_ts.*
  7481. 7481 .unset %barna_userip_retry.*
  7482. 7482 .unset %barna_userip_watchtry.*
  7483. 7483 }
  7484. 7484
  7485. 7485 var %running = %barna_q_running
  7486. 7486 if (%running !isnum 1-) var %running = 0
  7487. 7487 var %socks = $_barna_ipinfo_sock_count
  7488. 7488 var %live = $calc($numtok(%barna_q_items,44) + $numtok(%barna_q_low_items,44))
  7489. 7489 var %qvars = $var(%barna_q_*,0)
  7490. 7490
  7491. 7491 ; Si no hay cola ASN viva ni sockets, q_pending/q_ip/q_chans/q_try son basura.
  7492. 7492 if ((%live == 0) && (%running == 0) && (%socks == 0) && (%qvars > 20)) {
  7493. 7493 noop $_barna_q_temp_clear
  7494. 7494 inc %changed
  7495. 7495 }
  7496. 7496
  7497. 7497 ; Si no hay trabajo real, lookup/qry/ipdone/last_ip/ip_keep no deben acumularse.
  7498. 7498 if ((%live == 0) && (%running == 0) && (%socks == 0) && ($_barna_userip_q_count == 0) && ($var(%barna_userip_inflight.*,0) == 0)) {
  7499. 7499 if (($var(%barna_lookup.*,0) > 0) || ($var(%barna_qry.*,0) > 0) || ($var(%barna_ipdone.*,0) > 0) || ($var(%barna_last_ip.*,0) > 30) || ($var(%barna_ip_keep.*,0) > 60)) {
  7500. 7500 .unset %barna_lookup.*
  7501. 7501 .unset %barna_lookup_chans.*
  7502. 7502 .unset %barna_lookup_timer.*
  7503. 7503 .unset %barna_qry.*
  7504. 7504 .unset %barna_ipdone.*
  7505. 7505 .unset %barna_last_ip.*
  7506. 7506 .unset %barna_last_ip_ts.*
  7507. 7507 .unset %barna_ip_keep.*
  7508. 7508 inc %changed
  7509. 7509 }
  7510. 7510 }
  7511. 7511
  7512. 7512 ; Socket state: si no hay sockets/running, no conservar sock/rx/done.
  7513. 7513 if ((%running == 0) && (%socks == 0) && ($_barna_sockvar_count > 20)) {
  7514. 7514 noop $_barna_sockvar_gc
  7515. 7515 inc %changed
  7516. 7516 }
  7517. 7517
  7518. 7518 ; Dedupe ASN visible: util, pero no puede crecer por encima del cap.
  7519. 7519 var %emax = %barna_echo_asn_seen_max_vars
  7520. 7520 if (%emax !isnum 10-) var %emax = 160
  7521. 7521 if ($var(%barna_echo_asn_seen.*,0) > %emax) {
  7522. 7522 .unset %barna_echo_asn_seen.*
  7523. 7523 inc %changed
  7524. 7524 }
  7525. 7525
  7526. 7526 .unset %barna_statecap_hard_busy
  7527. 7527 return %changed
  7528. 7528}
  7529. 7529
  7530. 7530alias _barna_statecap_tick {
  7531. 7531 if (%barna_addon != 1) return 0
  7532. 7532 if (%barna_statecap_busy == 1) return 0
  7533. 7533
  7534. 7534 var %now = $ctime
  7535. 7535 if (%barna_statecap_last != $null) {
  7536. 7536 if ($calc(%now - %barna_statecap_last) < 6) return 0
  7537. 7537 }
  7538. 7538
  7539. 7539 set -u6 %barna_statecap_busy 1
  7540. 7540 set %barna_statecap_last %now
  7541. 7541
  7542. 7542 ; Build 99: mirar el total cada pocos segundos. Si supera el limite,
  7543. 7543 ; purgar familias incoherentes aunque no estemos en idle perfecto.
  7544. 7544 var %total = $var(%barna_*,0)
  7545. 7545 var %max = %barna_total_max_vars
  7546. 7546 if (%max !isnum 300-) var %max = 900
  7547. 7547
  7548. 7548 ; DIRECT100: no llamar al hardgc solo por tener varios inflight si hay cola WHOIP;
  7549. 7549 ; esos inflight son necesarios para aceptar RAW354 y emitir debug/ASN.
  7550. 7550 if ((%total > %max) || (($var(%barna_userip_inflight.*,0) > 180) && ($_barna_userip_q_count == 0)) || ($var(%barna_q_pending.*,0) > 20) || ($_barna_sockvar_count > 20) || ($var(%barna_ip_keep.*,0) > 60) || ($var(%barna_echo_asn_seen.*,0) > %barna_echo_asn_seen_max_vars)) {
  7551. 7551 noop $_barna_statecap_hardgc
  7552. 7552 }
  7553. 7553
  7554. 7554 ; Si no hay trabajo real en curso, purga agresiva de temporales.
  7555. 7555 var %running = %barna_q_running
  7556. 7556 if (%running !isnum 1-) var %running = 0
  7557. 7557
  7558. 7558 if (($_barna_userip_q_count == 0) && ($var(%barna_userip_inflight.*,0) == 0) && (%barna_q_items == $null) && (%barna_q_low_items == $null) && (%running == 0) && ($_barna_ipinfo_sock_count == 0)) {
  7559. 7559 noop $_barna_userip_idle_gc
  7560. 7560 noop $_barna_sockvar_gc
  7561. 7561 .unset %barna_rx.*
  7562. 7562 .unset %barna_asn_done.*
  7563. 7563 .unset %temp_ip_*
  7564. 7564 .unset %asn_val.*
  7565. 7565 .unset %as_name_val.*
  7566. 7566 .unset %barna_q_finished.*
  7567. 7567 }
  7568. 7568
  7569. 7569 ; Si hay crecimiento peligroso de estado socket pero no hay sockets reales, limpiarlo aunque haya caches.
  7570. 7570 if (($_barna_ipinfo_sock_count == 0) && ($_barna_sockvar_count > 20)) noop $_barna_sockvar_gc
  7571. 7571
  7572. 7572 .unset %barna_statecap_busy
  7573. 7573 return 0
  7574. 7574}
  7575. 7575
  7576. 7576; ------------------------------------------------------------
  7577. 7577; BLOQUE 8.9
  7578. 7578; CORE TICK ULTRA-LIGERO
  7579. 7579; ------------------------------------------------------------
  7580. 7580
  7581. 7581alias _barna_core_start {
  7582. 7582 if (%barna_addon != 1) return
  7583. 7583 _barna_core_ensure_timers
  7584. 7584}
  7585. 7585
  7586. 7586alias _barna_core_tick {
  7587. 7587 if (%barna_addon != 1) {
  7588. 7588 .timerBarnaCoreTick off
  7589. 7589 unset %barna_core_tick_running
  7590. 7590 unset %barna_core_tick_busy
  7591. 7591 return
  7592. 7592 }
  7593. 7593
  7594. 7594 if (%barna_core_tick_busy == 1) return
  7595. 7595 set -u5 %barna_core_tick_busy 1
  7596. 7596
  7597. 7597 _barna_runtime_defaults
  7598. 7598 _barna_core_ensure_timers
  7599. 7599
  7600. 7600 ; Build 132: CoreTick REALMENTE minimo.
  7601. 7601 ; STATECAP, CACHECAP, JOIN GC y WHOIPRESCUE se ejecutan escalonados desde
  7602. 7602 ; BarnaMaintenance. Aqui solo se despiertan colas y timers operativos.
  7603. 7603
  7604. 7604 if ($_barna_userip_q_count > 0) {
  7605. 7605 if ($timer(BarnaUserIPBatch) == $null) _barna_userip_q_process
  7606. 7606 }
  7607. 7607
  7608. 7608 var %running = %barna_q_running
  7609. 7609 if (%running == $null) var %running = 0
  7610. 7610
  7611. 7611 if ((%barna_q_items != $null) || (%barna_q_low_items != $null) || (%running > 0)) {
  7612. 7612 if (%running == 0) {
  7613. 7613 unset %barna_q_process_busy
  7614. 7614 _barna_q_process
  7615. 7615 var %running2 = %barna_q_running
  7616. 7616 if (%running2 == $null) var %running2 = 0
  7617. 7617 if ((%running2 == 0) && ($_barna_asn_queue_has_items == 1)) _barna_asn_direct_start_one
  7618. 7618 }
  7619. 7619 _barna_asn_pump_start_if_needed
  7620. 7620 }
  7621. 7621
  7622. 7622 if ($_barna_saquit_q_count > 0) _barna_saquit_q_start
  7623. 7623
  7624. 7624 if (%barna_echo_q_tail != $null) {
  7625. 7625 if ($timer(BarnaEchoQ) == $null) _barna_echo_q_process
  7626. 7626 }
  7627. 7627
  7628. 7628 unset %barna_core_tick_busy
  7629. 7629}
  7630. 7630
  7631. 7631alias _barna_userip_ttl {
  7632. 7632 var %ttl = %barna_userip_state_ttl
  7633. 7633
  7634. 7634 ; Build 99: TTL corto real para que inflight/lookup/qry no sobrevivan minutos.
  7635. 7635 if (%ttl !isnum 30-) var %ttl = 60
  7636. 7636 if (%ttl > 60) var %ttl = 60
  7637. 7637 if (%ttl < 30) var %ttl = 30
  7638. 7638
  7639. 7639 return %ttl
  7640. 7640}
  7641. 7641
  7642. 7642alias _barna_userip_q_sanity {
  7643. 7643 ; Build 94: sanidad O(1), sin recorrer head..tail.
  7644. 7644 ; No se cuenta slot por slot porque eso fue una fuente de lag.
  7645. 7645 var %cnt = %barna_userip_q_count_real
  7646. 7646
  7647. 7647 if (%cnt !isnum 1-) {
  7648. 7648 unset %barna_userip_q_count_real
  7649. 7649 if ((%barna_userip_q_head == $null) || (%barna_userip_q_tail == $null)) {
  7650. 7650 unset %barna_userip_q_head
  7651. 7651 unset %barna_userip_q_tail
  7652. 7652 unset %barna_userip_q_scheduled
  7653. 7653 .timerBarnaUserIPBatch off
  7654. 7654 }
  7655. 7655 return 0
  7656. 7656 }
  7657. 7657
  7658. 7658 if ((%barna_userip_q_head == $null) || (%barna_userip_q_tail == $null)) {
  7659. 7659 unset %barna_userip_q_head
  7660. 7660 unset %barna_userip_q_tail
  7661. 7661 unset %barna_userip_q_count_real
  7662. 7662 unset %barna_userip_q_scheduled
  7663. 7663 .timerBarnaUserIPBatch off
  7664. 7664 return 0
  7665. 7665 }
  7666. 7666
  7667. 7667 if (%barna_userip_q_head > %barna_userip_q_tail) {
  7668. 7668 unset %barna_userip_q_head
  7669. 7669 unset %barna_userip_q_tail
  7670. 7670 unset %barna_userip_q_count_real
  7671. 7671 unset %barna_userip_q_scheduled
  7672. 7672 .timerBarnaUserIPBatch off
  7673. 7673 return 0
  7674. 7674 }
  7675. 7675
  7676. 7676 return %cnt
  7677. 7677}
  7678. 7678alias _barna_userip_q_count {
  7679. 7679 ; Build 94: contador O(1). Evita escanear cientos de slots en cada JOIN/tick.
  7680. 7680 var %n = %barna_userip_q_count_real
  7681. 7681 if (%n !isnum 1-) return 0
  7682. 7682 return %n
  7683. 7683}
  7684. 7684
  7685. 7685alias _barna_userip_q_count_inc {
  7686. 7686 var %n = %barna_userip_q_count_real
  7687. 7687
  7688. 7688 if (%n == $null) var %n = 0
  7689. 7689 inc %n
  7690. 7690 set -u900 %barna_userip_q_count_real %n
  7691. 7691}
  7692. 7692
  7693. 7693alias _barna_userip_q_count_dec {
  7694. 7694 var %n = %barna_userip_q_count_real
  7695. 7695
  7696. 7696 if (%n == $null) var %n = 0
  7697. 7697 dec %n
  7698. 7698
  7699. 7699 if (%n < 0) var %n = 0
  7700. 7700
  7701. 7701 if (%n == 0) unset %barna_userip_q_count_real
  7702. 7702 else set -u900 %barna_userip_q_count_real %n
  7703. 7703}
  7704. 7704
  7705. 7705
  7706. 7706alias _barna_userip_q_drop_oldest_one {
  7707. 7707 var %head = %barna_userip_q_head
  7708. 7708 var %tail = %barna_userip_q_tail
  7709. 7709 var %guard = 0
  7710. 7710
  7711. 7711 if ((%head == $null) || (%tail == $null)) return 0
  7712. 7712
  7713. 7713 while ((%head <= %tail) && (%guard < 200)) {
  7714. 7714 inc %guard
  7715. 7715
  7716. 7716 var %ln = [ [ $+(%,barna_userip_q_item.,%head) ] ]
  7717. 7717 unset %barna_userip_q_item. $+ %head
  7718. 7718 set %barna_userip_q_head $calc(%head + 1)
  7719. 7719
  7720. 7720 if (%ln != $null) {
  7721. 7721 unset %barna_userip_q_slot. $+ %ln
  7722. 7722 unset %barna_userip_q_pending. $+ %ln
  7723. 7723 unset %barna_userip_q_nick. $+ %ln
  7724. 7724 unset %barna_lookup. $+ %ln
  7725. 7725 unset %barna_lookup_chans. $+ %ln
  7726. 7726 unset %barna_qry. $+ %ln
  7727. 7727 _barna_userip_q_count_dec
  7728. 7728
  7729. 7729 var %d = %barna_userip_drop_count
  7730. 7730 if (%d == $null) var %d = 0
  7731. 7731 inc %d
  7732. 7732 set -u3600 %barna_userip_drop_count %d
  7733. 7733
  7734. 7734 return 1
  7735. 7735 }
  7736. 7736
  7737. 7737 var %head = %barna_userip_q_head
  7738. 7738 }
  7739. 7739
  7740. 7740 return 0
  7741. 7741}
  7742. 7742
  7743. 7743alias _barna_userip_q_shed_if_needed {
  7744. 7744 ; Build 93: no hacer shed ni escanear cola en cada JOIN.
  7745. 7745 ; La capacidad de consultar cada nick se conserva: la cola FIFO regula ritmo sin descartar.
  7746. 7746 return 0
  7747. 7747}
  7748. 7748
  7749. 7749alias _barna_userip_watch_q_count {
  7750. 7750 var %n = %barna_userip_watch_q_count_real
  7751. 7751
  7752. 7752 if (%n !isnum 1-) return 0
  7753. 7753
  7754. 7754 return %n
  7755. 7755}
  7756. 7756
  7757. 7757alias _barna_userip_watch_q_count_inc {
  7758. 7758 var %n = %barna_userip_watch_q_count_real
  7759. 7759
  7760. 7760 if (%n == $null) var %n = 0
  7761. 7761 inc %n
  7762. 7762 set -u900 %barna_userip_watch_q_count_real %n
  7763. 7763}
  7764. 7764
  7765. 7765alias _barna_userip_watch_q_count_dec {
  7766. 7766 var %n = %barna_userip_watch_q_count_real
  7767. 7767
  7768. 7768 if (%n == $null) var %n = 0
  7769. 7769 dec %n
  7770. 7770
  7771. 7771 if (%n < 0) var %n = 0
  7772. 7772
  7773. 7773 if (%n == 0) unset %barna_userip_watch_q_count_real
  7774. 7774 else set -u900 %barna_userip_watch_q_count_real %n
  7775. 7775}
  7776. 7776
  7777. 7777alias _barna_userip_inflight_inc {
  7778. 7778 var %n = %barna_userip_inflight_count
  7779. 7779 if (%n == $null) var %n = 0
  7780. 7780 inc %n
  7781. 7781 set -u20 %barna_userip_inflight_count %n
  7782. 7782}
  7783. 7783
  7784. 7784alias _barna_userip_inflight_dec {
  7785. 7785 var %n = %barna_userip_inflight_count
  7786. 7786 if (%n == $null) var %n = 0
  7787. 7787 dec %n
  7788. 7788 if (%n < 0) var %n = 0
  7789. 7789
  7790. 7790 if (%n == 0) unset %barna_userip_inflight_count
  7791. 7791 else set -u20 %barna_userip_inflight_count %n
  7792. 7792}
  7793. 7793
  7794. 7794alias _barna_userip_q_schedule {
  7795. 7795 _barna_core_start
  7796. 7796
  7797. 7797 var %delay = $1
  7798. 7798
  7799. 7799 if (%delay !isnum 1-) var %delay = %barna_userip_q_delay
  7800. 7800 if (%delay !isnum 1-) var %delay = 3
  7801. 7801
  7802. 7802 if (%barna_userip_q_scheduled == 1) return
  7803. 7803
  7804. 7804 set -u60 %barna_userip_q_scheduled 1
  7805. 7805 .timerBarnaUserIPBatch 1 %delay _barna_userip_q_process
  7806. 7806}
  7807. 7807
  7808. 7808alias _barna_userip_q_enqueue {
  7809. 7809 ; Build 94: FIFO ligero. Solo guarda el nick real en el slot.
  7810. 7810 ; No crea q_slot por nick ni q_nick duplicado.
  7811. 7811 if ($1 == $null) return
  7812. 7812
  7813. 7813 var %nick = $1
  7814. 7814 var %ttl = $_barna_userip_ttl
  7815. 7815 var %tail = %barna_userip_q_tail
  7816. 7816
  7817. 7817 if (%tail == $null) var %tail = 0
  7818. 7818 inc %tail
  7819. 7819
  7820. 7820 set %barna_userip_q_tail %tail
  7821. 7821
  7822. 7822 if (%barna_userip_q_head == $null) set %barna_userip_q_head 1
  7823. 7823
  7824. 7824 set $+(-u,%ttl) %barna_userip_q_item. $+ %tail %nick
  7825. 7825 _barna_userip_q_count_inc
  7826. 7826}
  7827. 7827
  7828. 7828alias _barna_userip_q_add {
  7829. 7829 if ($1 == $null) return
  7830. 7830
  7831. 7831 var %nick = $1
  7832. 7832 var %ln = $lower(%nick)
  7833. 7833 var %ttl = $_barna_userip_ttl
  7834. 7834 var %chans = $_barna_seen_get(%nick)
  7835. 7835
  7836. 7836 if (%chans == $null) var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  7837. 7837
  7838. 7838 if ($_barna_is_privileged_nick(%nick)) {
  7839. 7839 _barna_dbg PRIVSAFE WHOIP COLA no add por @/+v: nick= %nick
  7840. 7840 _barna_privileged_cleanup_nick %nick WHOIP_Q_ADD
  7841. 7841 return
  7842. 7842 }
  7843. 7843
  7844. 7844 if (%chans == $null) {
  7845. 7845 _barna_dbg WHOIP COLA no add sin canales: nick= %nick
  7846. 7846 return
  7847. 7847 }
  7848. 7848
  7849. 7849 ; Build 94: no crear lookup/qry al ENCOLAR. Eso multiplicaba variables.
  7850. 7850 ; lookup/qry se activan solo al ENVIAR WHO real.
  7851. 7851 if ([ [ $+(%,barna_userip_q_pending.,%ln) ] ] == 1) {
  7852. 7852 ; Build 106:
  7853. 7853 ; Pending solo es valido si hay item FIFO real de este nick o inflight vivo.
  7854. 7854 ; Si no, es fantasma aunque la cola global tenga otros nicks; se limpia y se reencola.
  7855. 7855 if (([ [ $+(%,barna_userip_inflight.,%ln) ] ] != 1) && (!$_barna_userip_q_has_item(%nick))) {
  7856. 7856 _barna_dbg WHOIP COLA pending huerfano estricto, reencolo: nick= %nick chans= %chans
  7857. 7857 unset %barna_userip_q_pending. $+ %ln
  7858. 7858 unset %barna_userip_q_chans. $+ %ln
  7859. 7859 unset %barna_userip_sent_recent. $+ %ln
  7860. 7860 unset %barna_lookup. $+ %ln
  7861. 7861 unset %barna_lookup_chans. $+ %ln
  7862. 7862 unset %barna_qry. $+ %ln
  7863. 7863 unset %barna_ipdone. $+ %ln
  7864. 7864 }
  7865. 7865 else {
  7866. 7866 set $+(-u,%ttl) %barna_userip_q_chans. $+ %ln %chans
  7867. 7867 _barna_dbg WHOIP COLA ya pendiente, actualizo canales: nick= %nick chans= %chans
  7868. 7868 return
  7869. 7869 }
  7870. 7870 }
  7871. 7871
  7872. 7872 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) {
  7873. 7873 set $+(-u,%ttl) %barna_lookup_chans. $+ %ln %chans
  7874. 7874 _barna_dbg WHOIP COLA ya consultado, actualizo canales: nick= %nick chans= %chans
  7875. 7875 return
  7876. 7876 }
  7877. 7877
  7878. 7878 if ([ [ $+(%,barna_userip_sent_recent.,%ln) ] ] == 1) {
  7879. 7879 set $+(-u,%ttl) %barna_userip_q_chans. $+ %ln %chans
  7880. 7880 _barna_dbg WHOIP COLA ya enviado recientemente, no duplico: nick= %nick chans= %chans
  7881. 7881 return
  7882. 7882 }
  7883. 7883
  7884. 7884 set $+(-u,%ttl) %barna_userip_q_pending. $+ %ln 1
  7885. 7885 set $+(-u,%ttl) %barna_userip_q_chans. $+ %ln %chans
  7886. 7886 _barna_userip_q_enqueue %nick
  7887. 7887
  7888. 7888 _barna_dbg WHOIP COLA add light: nick= %nick chans= %chans total= $_barna_userip_q_count
  7889. 7889
  7890. 7890 _barna_core_start
  7891. 7891 _barna_userip_q_schedule %barna_userip_q_delay
  7892. 7892}
  7893. 7893
  7894. 7894alias _barna_userip_q_process {
  7895. 7895 if (%barna_addon != 1) return
  7896. 7896 if (%barna_userip_q_processing == 1) return
  7897. 7897 set -u10 %barna_userip_q_processing 1
  7898. 7898
  7899. 7899 unset %barna_userip_q_scheduled
  7900. 7900
  7901. 7901 ; Build 94: FIFO directo y variables minimas. No sanear ni escanear.
  7902. 7902 if ($_barna_userip_q_count == 0) {
  7903. 7903 unset %barna_userip_q_head
  7904. 7904 unset %barna_userip_q_tail
  7905. 7905 unset %barna_userip_q_count_real
  7906. 7906 .timerBarnaUserIPBatch off
  7907. 7907 noop $_barna_userip_idle_gc
  7908. 7908 unset %barna_userip_q_processing
  7909. 7909 return
  7910. 7910 }
  7911. 7911
  7912. 7912 var %max = %barna_userip_q_batch_max
  7913. 7913 var %delay = %barna_userip_q_batch_delay
  7914. 7914
  7915. 7915 if (%max !isnum 1-) var %max = 1
  7916. 7916 if (%delay !isnum 1-) var %delay = 1
  7917. 7917
  7918. 7918 ; DIRECT100: RAW354 trae nick consultado; permitimos varios inflight capados.
  7919. 7919 ; Esto evita que un WHO sin RAW315/RAW354 deje muda la cola tras JOIN masivo.
  7920. 7920 var %maxin = 12
  7921. 7921 var %pending_now = $_barna_userip_q_count
  7922. 7922
  7923. 7923 if (%pending_now >= %barna_userip_emergency_threshold) {
  7924. 7924 var %max = %barna_userip_emergency_batch_max
  7925. 7925 var %delay = %barna_userip_emergency_delay
  7926. 7926 }
  7927. 7927 elseif (%pending_now >= %barna_userip_turbo_threshold) {
  7928. 7928 var %max = %barna_userip_turbo_batch_max
  7929. 7929 var %delay = %barna_userip_turbo_delay
  7930. 7930 }
  7931. 7931
  7932. 7932 if (%max !isnum 1-) var %max = 1
  7933. 7933 if (%delay !isnum 1-) var %delay = 1
  7934. 7934 if (%max > 3) var %max = 3
  7935. 7935
  7936. 7936 var %sent = 0
  7937. 7937 var %sendlist
  7938. 7938 var %guard = 0
  7939. 7939 var %running = %barna_userip_inflight_count
  7940. 7940 if (%running !isnum 1-) var %running = 0
  7941. 7941
  7942. 7942 ; Build 100: usar solo el contador ligero y capado para ritmo.
  7943. 7943 ; No bloquear por $var(%barna_userip_inflight.*) ni por current_ln: el RAW354 real trae
  7944. 7944 ; nick consultado, asi que aceptar varios inflight evita que la cola se quede muda.
  7945. 7945
  7946. 7946 while ((%sent < %max) && (%running < %maxin) && (%guard < 80)) {
  7947. 7947 inc %guard
  7948. 7948
  7949. 7949 var %head = %barna_userip_q_head
  7950. 7950 var %tail = %barna_userip_q_tail
  7951. 7951
  7952. 7952 if ((%head == $null) || (%tail == $null) || (%head > %tail)) {
  7953. 7953 unset %barna_userip_q_head
  7954. 7954 unset %barna_userip_q_tail
  7955. 7955 unset %barna_userip_q_count_real
  7956. 7956 break
  7957. 7957 }
  7958. 7958
  7959. 7959 var %nick = [ [ $+(%,barna_userip_q_item.,%head) ] ]
  7960. 7960 unset %barna_userip_q_item. $+ %head
  7961. 7961 set %barna_userip_q_head $calc(%head + 1)
  7962. 7962
  7963. 7963 if (%nick == $null) continue
  7964. 7964
  7965. 7965 _barna_userip_q_count_dec
  7966. 7966
  7967. 7967 var %ln = $lower(%nick)
  7968. 7968
  7969. 7969 if ($_barna_is_privileged_nick(%nick)) {
  7970. 7970 _barna_dbg PRIVSAFE WHOIP COLA descarta nick con @/+v: nick= %nick
  7971. 7971 _barna_privileged_cleanup_nick %nick WHOIP_Q_PROCESS
  7972. 7972 continue
  7973. 7973 }
  7974. 7974
  7975. 7975 if ([ [ $+(%,barna_userip_q_pending.,%ln) ] ] != 1) {
  7976. 7976 _barna_dbg WHOIP COLA descarta item ya no pendiente: nick= %nick
  7977. 7977 continue
  7978. 7978 }
  7979. 7979
  7980. 7980 unset %barna_userip_q_pending. $+ %ln
  7981. 7981
  7982. 7982 var %chans = [ [ $+(%,barna_userip_q_chans.,%ln) ] ]
  7983. 7983 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  7984. 7984 if (%chans == $null) var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  7985. 7985
  7986. 7986 if (%chans == $null) {
  7987. 7987 _barna_dbg WHOIP COLA descarta sin canales: nick= %nick
  7988. 7988 unset %barna_userip_q_chans. $+ %ln
  7989. 7989 unset %barna_lookup. $+ %ln
  7990. 7990 unset %barna_lookup_chans. $+ %ln
  7991. 7991 unset %barna_qry. $+ %ln
  7992. 7992 unset %barna_ipdone. $+ %ln
  7993. 7993 continue
  7994. 7994 }
  7995. 7995
  7996. 7996 ; Si ya tenemos IP fresca/cache, no pedir WHO otra vez.
  7997. 7997 if ($_barna_fast_asn_if_ip_ready(%nick,COLA_IP_READY)) {
  7998. 7998 unset %barna_userip_q_chans. $+ %ln
  7999. 7999 continue
  8000. 8000 }
  8001. 8001
  8002. 8002 var %ttl = $_barna_userip_ttl
  8003. 8003
  8004. 8004 ; Estado de consulta SOLO al enviar WHO real.
  8005. 8005 set $+(-u,%ttl) %barna_lookup. $+ %ln 1
  8006. 8006 set $+(-u,%ttl) %barna_lookup_chans. $+ %ln %chans
  8007. 8007 set $+(-u,%ttl) %barna_qry. $+ %ln 1
  8008. 8008 set -u15 %barna_userip_sent_recent. $+ %ln 1
  8009. 8009
  8010. 8010 if (%sendlist == $null) var %sendlist = %nick
  8011. 8011 else if ($len(%sendlist) < 220) var %sendlist = %sendlist $+ $chr(32) $+ %nick
  8012. 8012
  8013. 8013 _barna_dbg WHOIP COLA prepara light: nick= %nick chans= %chans
  8014. 8014
  8015. 8015 if ($_barna_whoip_send(%nick)) {
  8016. 8016 inc %sent
  8017. 8017 inc %running
  8018. 8018 }
  8019. 8019 else {
  8020. 8020 unset %barna_userip_q_chans. $+ %ln
  8021. 8021 }
  8022. 8022 }
  8023. 8023
  8024. 8024 if (%sent > 0) {
  8025. 8025 _barna_dbg WHOIP COLA consulta light: nicks= %sendlist enviados= %sent pendientes= $_barna_userip_q_count inflight= %barna_userip_inflight_count
  8026. 8026 }
  8027. 8027
  8028. 8028 unset %barna_userip_q_processing
  8029. 8029
  8030. 8030 if ($_barna_userip_q_count > 0) _barna_userip_q_schedule %delay
  8031. 8031 else noop $_barna_userip_idle_gc
  8032. 8032}
  8033. 8033alias _barna_userip_q_release {
  8034. 8034 if ($1 == $null) return
  8035. 8035
  8036. 8036 var %nick = $1
  8037. 8037 var %ln = $lower(%nick)
  8038. 8038 var %reason = $2-
  8039. 8039 var %whoip_timer = BarnaWHOIPChk_ $+ $md5(%ln,0)
  8040. 8040 if ($timer(%whoip_timer) != $null) .timer $+ %whoip_timer off
  8041. 8041 ; Build 94: la cola ya no usa q_slot por nick.
  8042. 8042 ; Si el nick estaba pendiente, se marca como no pendiente; el item FIFO viejo se saltara al llegar al head.
  8043. 8043 unset %barna_userip_q_pending. $+ %ln
  8044. 8044 unset %barna_userip_q_chans. $+ %ln
  8045. 8045
  8046. 8046 var %wslot = [ [ $+(%,barna_userip_watch_q_slot.,%ln) ] ]
  8047. 8047
  8048. 8048 if (%wslot != $null) {
  8049. 8049 if ([ [ $+(%,barna_userip_watch_q_item.,%wslot) ] ] != $null) _barna_userip_watch_q_count_dec
  8050. 8050 unset %barna_userip_watch_q_item. $+ %wslot
  8051. 8051 unset %barna_userip_watch_q_slot. $+ %ln
  8052. 8052 }
  8053. 8053
  8054. 8054 unset %barna_userip_q_pending. $+ %ln
  8055. 8055 unset %barna_userip_q_chans. $+ %ln
  8056. 8056 unset %barna_userip_q_nick. $+ %ln
  8057. 8057
  8058. 8058 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) {
  8059. 8059 unset %barna_userip_inflight. $+ %ln
  8060. 8060 _barna_userip_inflight_dec
  8061. 8061 }
  8062. 8062
  8063. 8063 unset %barna_userip_retry. $+ %ln
  8064. 8064 unset %barna_userip_sent_ts. $+ %ln
  8065. 8065 unset %barna_userip_sent_recent. $+ %ln
  8066. 8066 if (%barna_whoip_current_ln == %ln) {
  8067. 8067 unset %barna_whoip_current_nick
  8068. 8068 unset %barna_whoip_current_ln
  8069. 8069 }
  8070. 8070
  8071. 8071 ; Build 94: sin tokens WHOX por consulta.
  8072. 8072
  8073. 8073 _barna_lookup_timer_off %nick
  8074. 8074
  8075. 8075 _barna_dbg WHOIP COLA release: nick= %nick reason= %reason inflight= %barna_userip_inflight_count
  8076. 8076
  8077. 8077 if ($_barna_userip_q_count == 0) noop $_barna_userip_idle_gc
  8078. 8078
  8079. 8079 if ($_barna_userip_q_count > 0) {
  8080. 8080 if (%barna_userip_q_processing == 1) {
  8081. 8081 _barna_userip_q_schedule 1
  8082. 8082 }
  8083. 8083 else {
  8084. 8084 if (!$_barna_whoip_next_fast) _barna_userip_q_schedule 1
  8085. 8085 }
  8086. 8086 }
  8087. 8087}
  8088. 8088
  8089. 8089; ------------------------------------------------------------
  8090. 8090; BLOQUE 7.6.1
  8091. 8091; WATCHDOG WHOIP FIFO
  8092. 8092; Evita escanear cientos de variables con $var() en cada ciclo.
  8093. 8093; ------------------------------------------------------------
  8094. 8094
  8095. 8095alias _barna_userip_watch_q_enqueue {
  8096. 8096 if ($1 == $null) return
  8097. 8097
  8098. 8098 var %ln = $1
  8099. 8099 var %ttl = $_barna_userip_ttl
  8100. 8100 var %oldslot = [ [ $+(%,barna_userip_watch_q_slot.,%ln) ] ]
  8101. 8101
  8102. 8102 if (%oldslot != $null) {
  8103. 8103 set $+(-u,%ttl) %barna_userip_watch_q_item. $+ %oldslot %ln
  8104. 8104 return
  8105. 8105 }
  8106. 8106
  8107. 8107 var %tail = %barna_userip_watch_q_tail
  8108. 8108
  8109. 8109 if (%tail == $null) var %tail = 0
  8110. 8110 inc %tail
  8111. 8111
  8112. 8112 set %barna_userip_watch_q_tail %tail
  8113. 8113
  8114. 8114 if (%barna_userip_watch_q_head == $null) set %barna_userip_watch_q_head 1
  8115. 8115
  8116. 8116 set $+(-u,%ttl) %barna_userip_watch_q_item. $+ %tail %ln
  8117. 8117 set $+(-u,%ttl) %barna_userip_watch_q_slot. $+ %ln %tail
  8118. 8118 _barna_userip_watch_q_count_inc
  8119. 8119}
  8120. 8120
  8121. 8121; ------------------------------------------------------------
  8122. 8122; BLOQUE 7.6.2
  8123. 8123; WATCHDOG WHOIP UNICO
  8124. 8124; No usa $var(%barna_userip_inflight.*) para no cargar mIRC.
  8125. 8125; ------------------------------------------------------------
  8126. 8126
  8127. 8127alias _barna_userip_watchdog_schedule {
  8128. 8128 if (%barna_userip_watchdog != 1) return
  8129. 8129 if (%barna_userip_watchdog_scheduled == 1) return
  8130. 8130
  8131. 8131 var %delay = %barna_userip_watchdog_delay
  8132. 8132 if (%delay !isnum 5-) var %delay = 18
  8133. 8133
  8134. 8134 set -u120 %barna_userip_watchdog_scheduled 1
  8135. 8135 .timerBarnaUserIPWatchdog 1 %delay _barna_userip_watchdog_process
  8136. 8136}
  8137. 8137
  8138. 8138alias _barna_userip_watchdog_process {
  8139. 8139 unset %barna_userip_watchdog_scheduled
  8140. 8140
  8141. 8141 if (%barna_addon != 1) return
  8142. 8142 if (%barna_userip_watchdog != 1) return
  8143. 8143
  8144. 8144 var %head = %barna_userip_watch_q_head
  8145. 8145 var %tail = %barna_userip_watch_q_tail
  8146. 8146 var %batch = %barna_userip_watchdog_batch
  8147. 8147 var %delay = %barna_userip_watchdog_delay
  8148. 8148 var %maxtry = %barna_userip_watchdog_retry_max
  8149. 8149 var %now = $ctime
  8150. 8150 var %checked = 0
  8151. 8151
  8152. 8152 if (%batch !isnum 1-) var %batch = 25
  8153. 8153 if (%delay !isnum 5-) var %delay = 15
  8154. 8154 if (%maxtry !isnum 0-) var %maxtry = 0
  8155. 8155
  8156. 8156 if (%head == $null) return
  8157. 8157 if (%tail == $null) return
  8158. 8158
  8159. 8159 if ($_barna_userip_watch_q_count == 0) {
  8160. 8160 unset %barna_userip_watch_q_head
  8161. 8161 unset %barna_userip_watch_q_tail
  8162. 8162 return
  8163. 8163 }
  8164. 8164
  8165. 8165 while ((%head <= %tail) && (%checked < %batch)) {
  8166. 8166 var %ln = [ [ $+(%,barna_userip_watch_q_item.,%head) ] ]
  8167. 8167
  8168. 8168 if (%ln == $null) {
  8169. 8169 unset %barna_userip_watch_q_item. $+ %head
  8170. 8170 inc %head
  8171. 8171 set %barna_userip_watch_q_head %head
  8172. 8172 inc %checked
  8173. 8173 continue
  8174. 8174 }
  8175. 8175
  8176. 8176 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] != 1) {
  8177. 8177 _barna_userip_watch_q_count_dec
  8178. 8178 unset %barna_userip_watch_q_item. $+ %head
  8179. 8179 unset %barna_userip_watch_q_slot. $+ %ln
  8180. 8180 inc %head
  8181. 8181 set %barna_userip_watch_q_head %head
  8182. 8182 inc %checked
  8183. 8183 continue
  8184. 8184 }
  8185. 8185
  8186. 8186 var %nick = [ [ $+(%,barna_userip_q_nick.,%ln) ] ]
  8187. 8187 var %sent = [ [ $+(%,barna_userip_sent_ts.,%ln) ] ]
  8188. 8188 var %age = 0
  8189. 8189
  8190. 8190 if (%nick == $null) var %nick = %ln
  8191. 8191 if (%sent != $null) var %age = $calc(%now - %sent)
  8192. 8192
  8193. 8193 ; FIFO: si el primero aun no ha caducado, los siguientes son mas nuevos.
  8194. 8194 if ((%sent != $null) && (%age < %delay)) break
  8195. 8195
  8196. 8196 _barna_userip_watch_q_count_dec
  8197. 8197 unset %barna_userip_watch_q_item. $+ %head
  8198. 8198 unset %barna_userip_watch_q_slot. $+ %ln
  8199. 8199 inc %head
  8200. 8200 set %barna_userip_watch_q_head %head
  8201. 8201 inc %checked
  8202. 8202
  8203. 8203 var %seen = $_barna_seen_get(%nick)
  8204. 8204 var %try = [ [ $+(%,barna_userip_watchtry.,%ln) ] ]
  8205. 8205
  8206. 8206 if (%try == $null) var %try = 0
  8207. 8207
  8208. 8208 if (%seen == $null) {
  8209. 8209 _barna_dbg WHOIP watchdog libera sin canales: nick= %nick age= %age
  8210. 8210 _barna_userip_q_release %nick WATCHDOG_LEAVE
  8211. 8211 unset %barna_lookup. $+ %ln
  8212. 8212 unset %barna_lookup_chans. $+ %ln
  8213. 8213 unset %barna_qry. $+ %ln
  8214. 8214 unset %barna_ipdone. $+ %ln
  8215. 8215 unset %barna_userip_watchtry. $+ %ln
  8216. 8216 }
  8217. 8217 elseif (%try < %maxtry) {
  8218. 8218 var %backlog = $_barna_userip_q_count
  8219. 8219 var %retry_limit = %barna_userip_retry_backlog_limit
  8220. 8220 if (%retry_limit !isnum 0-) var %retry_limit = 8
  8221. 8221
  8222. 8222 if (%backlog <= %retry_limit) {
  8223. 8223 inc %try
  8224. 8224 set -u600 %barna_userip_watchtry. $+ %ln %try
  8225. 8225 _barna_dbg WHOIP watchdog reintento en cola: nick= %nick try= %try age= %age backlog= %backlog chans= %seen
  8226. 8226 _barna_userip_q_release %nick WATCHDOG_RETRY
  8227. 8227 unset %barna_ipdone. $+ %ln
  8228. 8228 _barna_lookup_start %nick
  8229. 8229 }
  8230. 8230 else {
  8231. 8231 _barna_dbg WHOIP watchdog sin retry por atasco: nick= %nick try= %try age= %age backlog= %backlog limit= %retry_limit
  8232. 8232 _barna_userip_q_release %nick WATCHDOG_BACKLOG_TIMEOUT
  8233. 8233 unset %barna_lookup. $+ %ln
  8234. 8234 unset %barna_lookup_chans. $+ %ln
  8235. 8235 unset %barna_qry. $+ %ln
  8236. 8236 unset %barna_ipdone. $+ %ln
  8237. 8237 unset %barna_userip_watchtry. $+ %ln
  8238. 8238 }
  8239. 8239 }
  8240. 8240 else {
  8241. 8241 _barna_dbg WHOIP watchdog agotado: nick= %nick try= %try age= %age
  8242. 8242 _barna_userip_q_release %nick WATCHDOG_TIMEOUT
  8243. 8243 unset %barna_lookup. $+ %ln
  8244. 8244 unset %barna_lookup_chans. $+ %ln
  8245. 8245 unset %barna_qry. $+ %ln
  8246. 8246 unset %barna_ipdone. $+ %ln
  8247. 8247 unset %barna_userip_watchtry. $+ %ln
  8248. 8248 }
  8249. 8249 }
  8250. 8250
  8251. 8251 if (%head > %tail) {
  8252. 8252 unset %barna_userip_watch_q_head
  8253. 8253 unset %barna_userip_watch_q_tail
  8254. 8254 }
  8255. 8255
  8256. 8256 if ($_barna_userip_watch_q_count > 0) {
  8257. 8257 _barna_userip_watchdog_schedule
  8258. 8258 }
  8259. 8259 else {
  8260. 8260 unset %barna_userip_watch_q_head
  8261. 8261 unset %barna_userip_watch_q_tail
  8262. 8262 }
  8263. 8263}
  8264. 8264
  8265. 8265alias _barna_userip_slow_retry_schedule {
  8266. 8266 if ($1 == $null) return
  8267. 8267
  8268. 8268 ; Modo conservador anti-lag: sin reintentos lentos.
  8269. 8269 _barna_dbg WHOIP lento omitido por modo conservador: nick= $1 reason= $2-
  8270. 8270}
  8271. 8271
  8272. 8272alias _barna_userip_slow_retry_now {
  8273. 8273 if ($1 == $null) return
  8274. 8274
  8275. 8275 ; Modo conservador anti-lag: no reencola WHOIP desde timer lento.
  8276. 8276}
  8277. 8277
  8278. 8278alias _barna_lookup_start {
  8279. 8279 if ($1 == $null) return
  8280. 8280
  8281. 8281 var %nick = $1
  8282. 8282 var %ln = $lower(%nick)
  8283. 8283 var %chans = $_barna_seen_get(%nick)
  8284. 8284 var %ttl = $_barna_userip_ttl
  8285. 8285
  8286. 8286 if ($_barna_is_join_exception(%nick)) {
  8287. 8287 _barna_dbg EXCEPTIONSAFE no inicia LOOKUP/WHOIP: nick= %nick
  8288. 8288 _barna_exception_cleanup_nick %nick
  8289. 8289 return
  8290. 8290 }
  8291. 8291
  8292. 8292 if ($_barna_is_privileged_nick(%nick)) {
  8293. 8293 _barna_dbg PRIVSAFE no inicia LOOKUP/WHOIP por @/+v: nick= %nick
  8294. 8294 _barna_privileged_cleanup_nick %nick LOOKUP_START
  8295. 8295 return
  8296. 8296 }
  8297. 8297
  8298. 8298 if (%chans == $null) return
  8299. 8299
  8300. 8300 set $+(-u,%ttl) %barna_lookup. $+ %ln 1
  8301. 8301 set $+(-u,%ttl) %barna_lookup_chans. $+ %ln %chans
  8302. 8302 set $+(-u,%ttl) %barna_userip_retry. $+ %ln 0
  8303. 8303 set $+(-u,%ttl) %barna_qry. $+ %ln 1
  8304. 8304 unset %barna_ipdone. $+ %ln
  8305. 8305
  8306. 8306 _barna_lookup_timer_off %nick
  8307. 8307
  8308. 8308 _barna_dbg LOOKUP start WHOIP en cola: nick= %nick chans= %chans
  8309. 8309
  8310. 8310 _barna_userip_q_add %nick
  8311. 8311}
  8312. 8312
  8313. 8313alias _barna_lookup_retry {
  8314. 8314 if ($1 == $null) return
  8315. 8315
  8316. 8316 ; Modo conservador anti-lag: sin reintentos automaticos de WHOIP.
  8317. 8317 ; Reintentar por timer fue una de las causas de acumulación y lag.
  8318. 8318 _barna_userip_q_release $1 RETRY_DISABLED
  8319. 8319}
  8320. 8320
  8321. 8321alias _barna_ip_found {
  8322. 8322 if ($1 == $null) return
  8323. 8323 if ($2 == $null) return
  8324. 8324
  8325. 8325 var %nick = $1
  8326. 8326 var %ip = $2
  8327. 8327 var %src = $3
  8328. 8328 var %ln = $lower(%nick)
  8329. 8329
  8330. 8330 if ($_barna_is_join_exception(%nick)) {
  8331. 8331 _barna_dbg EXCEPTIONSAFE IP_FOUND ignora nick exceptuado: nick= %nick ip= %ip src= %src
  8332. 8332 _barna_exception_cleanup_nick %nick
  8333. 8333 return
  8334. 8334 }
  8335. 8335
  8336. 8336 if ($_barna_is_privileged_nick(%nick)) {
  8337. 8337 _barna_dbg PRIVSAFE IP_FOUND ignora nick con @/+v: nick= %nick ip= %ip src= %src
  8338. 8338 _barna_privileged_cleanup_nick %nick IP_FOUND
  8339. 8339 return
  8340. 8340 }
  8341. 8341
  8342. 8342 _barna_lookup_timer_off %nick
  8343. 8343
  8344. 8344 var %slowt = [ [ $+(%,barna_userip_slow_timer.,%ln) ] ]
  8345. 8345 if (%slowt != $null) .timer $+ %slowt off
  8346. 8346 unset %barna_userip_slow_retry. $+ %ln
  8347. 8347 unset %barna_userip_slow_timer. $+ %ln
  8348. 8348
  8349. 8349 if (!$_barna_is_ipv4(%ip)) {
  8350. 8350 _barna_dbg IP ignorada no IPv4: nick= %nick ip= %ip src= %src
  8351. 8351 _barna_userip_q_release %nick IP_NO_IPV4
  8352. 8352 unset %barna_lookup. $+ %ln
  8353. 8353 unset %barna_lookup_chans. $+ %ln
  8354. 8354 unset %barna_qry. $+ %ln
  8355. 8355 unset %barna_ipdone. $+ %ln
  8356. 8356 unset %barna_userip_retry. $+ %ln
  8357. 8357 unset %barna_userip_sent_ts. $+ %ln
  8358. 8358 unset %barna_userip_watchtry. $+ %ln
  8359. 8359 return
  8360. 8360 }
  8361. 8361
  8362. 8362 _barna_ip_store %nick %ip
  8363. 8363 var %ida = [ [ $+(%,barna_q_active.,%ln) ] ]
  8364. 8364 var %idp = [ [ $+(%,barna_q_pending.,%ln) ] ]
  8365. 8365
  8366. 8366 var %chans = $_barna_seen_get(%nick)
  8367. 8367
  8368. 8368 if (%chans == $null) {
  8369. 8369 var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  8370. 8370 }
  8371. 8371
  8372. 8372 if (%chans == $null) && (%ida != $null) {
  8373. 8373 var %chans = [ [ $+(%,barna_q_chans.,%ida) ] ]
  8374. 8374 }
  8375. 8375
  8376. 8376 if (%chans == $null) && (%idp != $null) {
  8377. 8377 var %chans = [ [ $+(%,barna_q_chans.,%idp) ] ]
  8378. 8378 }
  8379. 8379
  8380. 8380 if (%chans == $null) {
  8381. 8381 _barna_dbg IP encontrada sin canales, ignoro: nick= %nick ip= %ip src= %src
  8382. 8382 _barna_userip_q_release %nick IP_SIN_CANALES
  8383. 8383 unset %barna_lookup. $+ %ln
  8384. 8384 unset %barna_lookup_chans. $+ %ln
  8385. 8385 unset %barna_qry. $+ %ln
  8386. 8386 unset %barna_ipdone. $+ %ln
  8387. 8387 unset %barna_userip_retry. $+ %ln
  8388. 8388 unset %barna_userip_sent_ts. $+ %ln
  8389. 8389 unset %barna_userip_watchtry. $+ %ln
  8390. 8390 return
  8391. 8391 }
  8392. 8392
  8393. 8393 set -u60 %barna_lookup_chans. $+ %ln %chans
  8394. 8394
  8395. 8395 ; Build 83:
  8396. 8396 ; Si la IP ya tiene cache ASN/ISP, aplicamos cache inmediatamente y
  8397. 8397 ; cerramos el estado WHOIP. Esto evita retrasos donde /barna.trace muestra
  8398. 8398 ; last_ip + cache_asn pero sigue en WHOIP_enviado_o_esperando_RAW354.
  8399. 8399 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  8400. 8400 _barna_dbg FASTCACHE en IP_FOUND: nick= %nick ip= %ip src= %src chans= %chans
  8401. 8401
  8402. 8402 _barna_userip_q_release %nick FASTCACHE_IP_FOUND
  8403. 8403 unset %barna_lookup. $+ %ln
  8404. 8404 unset %barna_lookup_chans. $+ %ln
  8405. 8405 unset %barna_qry. $+ %ln
  8406. 8406 unset %barna_ipdone. $+ %ln
  8407. 8407 unset %barna_userip_retry. $+ %ln
  8408. 8408 unset %barna_userip_sent_ts. $+ %ln
  8409. 8409 unset %barna_userip_watchtry. $+ %ln
  8410. 8410 unset %barna_userip_sent_recent. $+ %ln
  8411. 8411 return
  8412. 8412 }
  8413. 8413
  8414. 8414 if ([ [ $+(%,barna_ipdone.,%ln) ] ] == 1) {
  8415. 8415 if (%ida != $null) {
  8416. 8416 set -u90 %barna_q_chans. $+ %ida %chans
  8417. 8417 _barna_dbg IP duplicada con consulta activa, actualizo canales: nick= %nick ip= %ip src= %src id= %ida chans= %chans
  8418. 8418 return
  8419. 8419 }
  8420. 8420
  8421. 8421 if (%idp != $null) {
  8422. 8422 set -u120 %barna_q_ip. $+ %idp %ip
  8423. 8423 set -u90 %barna_q_chans. $+ %idp %chans
  8424. 8424 set -u120 %barna_q_ts. $+ %idp $ctime
  8425. 8425 _barna_dbg IP duplicada con consulta pendiente, actualizo y proceso: nick= %nick ip= %ip src= %src id= %idp chans= %chans
  8426. 8426 _barna_q_schedule 1
  8427. 8427 return
  8428. 8428 }
  8429. 8429
  8430. 8430 _barna_dbg IP duplicada pero sin cola activa/pendiente, reencolo ASN: nick= %nick ip= %ip src= %src chans= %chans
  8431. 8431 unset %barna_ipdone. $+ %ln
  8432. 8432 _barna_q_add %nick %ip %chans
  8433. 8433 return
  8434. 8434 }
  8435. 8435
  8436. 8436 set -u30 %barna_ipdone. $+ %ln 1
  8437. 8437
  8438. 8438 _barna_dbg IP encontrada: nick= %nick ip= %ip src= %src chans= %chans
  8439. 8439
  8440. 8440 if ($_barna_ip_known_bad_prefix(%ip,%chans)) {
  8441. 8441 _barna_bad_prefix_punish %nick %ip %src %chans
  8442. 8442 _barna_lookup_timer_off %nick
  8443. 8443 _barna_userip_q_release %nick BADPFX_LOW_ASN
  8444. 8444 unset %barna_lookup. $+ %ln
  8445. 8445 unset %barna_lookup_chans. $+ %ln
  8446. 8446 unset %barna_qry. $+ %ln
  8447. 8447 unset %barna_ipdone. $+ %ln
  8448. 8448 unset %barna_userip_retry. $+ %ln
  8449. 8449 unset %barna_userip_sent_ts. $+ %ln
  8450. 8450 unset %barna_userip_watchtry. $+ %ln
  8451. 8451 _barna_q_add_low %nick %ip %chans
  8452. 8452 return
  8453. 8453 }
  8454. 8454
  8455. 8455 unset %barna_userip_sent_ts. $+ %ln
  8456. 8456 unset %barna_userip_watchtry. $+ %ln
  8457. 8457 _barna_userip_q_release %nick IP_OK
  8458. 8458 _barna_q_clear_ghost_light
  8459. 8459 _barna_q_add %nick %ip %chans
  8460. 8460 _barna_q_process
  8461. 8461 _barna_asn_pump_start_if_needed
  8462. 8462}
  8463. 8463
  8464. 8464; ------------------------------------------------------------
  8465. 8465; BLOQUE 8
  8466. 8466; JOIN
  8467. 8467; ------------------------------------------------------------
  8468. 8468
  8469. 8469; JOINONLY_DELAYSAFE: solo se consulta por JOIN real, con delay.
  8470. 8470; Build 115: elimina AUTONICKSCAN/nicklist rescan. El JOIN programa
  8471. 8471; una espera corta; si el nick recibe +v/@/%/&/~ o es excepcion, se cancela todo.
  8472. 8472; ------------------------------------------------------------
  8473. 8473
  8474. 8474alias _barna_join_delay_timer_name {
  8475. 8475 if ($1 == $null) return
  8476. 8476 return BarnaJoinDelay_ $+ $md5($lower($1),0)
  8477. 8477}
  8478. 8478
  8479. 8479; Build 115: contador ligero de JOIN delay.
  8480. 8480; Contamos %barna_join_delay_chan.* porque ya no guardamos nick/timer/chans por cada JOIN.
  8481. 8481alias _barna_join_delay_count {
  8482. 8482 return $var(%barna_join_delay_chan.*,0)
  8483. 8483}
  8484. 8484
  8485. 8485; Build 115: GC ligero para evitar que un flood de JOIN deje muchas variables
  8486. 8486; de delay si algun timer no llega a disparar o el nick ya no esta.
  8487. 8487
  8488. 8488; Build 122: si entran muchos JOIN, no esperamos a que todos los timers de 4s/2s
  8489. 8489; venzan uno por uno. Bajo presion, procesa anticipadamente un lote pequeno de JOIN_DELAY
  8490. 8490; ya maduros. No cancela consultas: llama a _barna_join_delay_fire y apaga su timer para evitar duplicados.
  8491. 8491alias _barna_join_delay_pressure_tick {
  8492. 8492 if (%barna_addon != 1) return 0
  8493. 8493
  8494. 8494 var %total = $_barna_join_delay_count
  8495. 8495 if (%total <= 0) return 0
  8496. 8496
  8497. 8497 var %th = %barna_join_delay_fast_threshold
  8498. 8498 if (%th !isnum 1-) var %th = 35
  8499. 8499 if (%total < %th) return 0
  8500. 8500
  8501. 8501 var %batch = %barna_join_delay_fast_batch
  8502. 8502 if (%batch !isnum 1-) var %batch = 10
  8503. 8503 if (%batch > 28) var %batch = 28
  8504. 8504
  8505. 8505 var %age = %barna_join_delay_fast_age
  8506. 8506 if (%age !isnum 1-) var %age = 2
  8507. 8507
  8508. 8508 var %now = $ctime
  8509. 8509 var %i = $var(%barna_join_delay_chan.*,0)
  8510. 8510 var %done = 0
  8511. 8511 var %prefix = $+(%,barna_join_delay_chan.)
  8512. 8512
  8513. 8513 while ((%i >= 1) && (%done < %batch)) {
  8514. 8514 var %v = $var(%barna_join_delay_chan.*,%i)
  8515. 8515 var %ln = $right(%v,-$len(%prefix))
  8516. 8516 var %ts = [ [ $+(%,barna_join_delay_ts.,%ln) ] ]
  8517. 8517 var %nick = [ [ $+(%,barna_join_delay_nick.,%ln) ] ]
  8518. 8518 if (%nick == $null) var %nick = %ln
  8519. 8519
  8520. 8520 if (%ts !isnum) var %ts = 0
  8521. 8521
  8522. 8522 if ($calc(%now - %ts) >= %age) {
  8523. 8523 var %timer = $_barna_join_delay_timer_name(%nick)
  8524. 8524 if (%timer != $null) .timer $+ %timer off
  8525. 8525 _barna_join_delay_fire %nick
  8526. 8526 inc %done
  8527. 8527 }
  8528. 8528
  8529. 8529 dec %i
  8530. 8530 }
  8531. 8531
  8532. 8532 if (%done > 0) _barna_dbg JOIN_DELAY_PRESSURE procesados= %done restantes= $_barna_join_delay_count total_inicial= %total th= %th age= %age
  8533. 8533 return %done
  8534. 8534}
  8535. 8535
  8536. 8536alias _barna_join_delay_gc_tick {
  8537. 8537 if (%barna_addon != 1) return
  8538. 8538
  8539. 8539 var %total = $_barna_join_delay_count
  8540. 8540 if (%total <= 0) return
  8541. 8541
  8542. 8542 var %age = %barna_join_delay_gc_age
  8543. 8543 if (%age !isnum 8-60) var %age = 18
  8544. 8544
  8545. 8545 var %max = %barna_join_delay_max_pending
  8546. 8546 if (%max !isnum 40-200) var %max = 120
  8547. 8547
  8548. 8548 var %now = $ctime
  8549. 8549 var %i = $var(%barna_join_delay_chan.*,0)
  8550. 8550 var %cleaned = 0
  8551. 8551 var %prefix = $+(%,barna_join_delay_chan.)
  8552. 8552
  8553. 8553 while (%i >= 1) {
  8554. 8554 var %v = $var(%barna_join_delay_chan.*,%i)
  8555. 8555 var %ln = $right(%v,-$len(%prefix))
  8556. 8556 var %ts = [ [ $+(%,barna_join_delay_ts.,%ln) ] ]
  8557. 8557 var %nick = %ln
  8558. 8558
  8559. 8559 if (%ts !isnum) var %ts = 0
  8560. 8560
  8561. 8561 if (($calc(%now - %ts) > %age) || ($_barna_join_delay_count > %max)) {
  8562. 8562 _barna_join_delay_cancel %nick JOIN_DELAY_GC
  8563. 8563 inc %cleaned
  8564. 8564 }
  8565. 8565
  8566. 8566 dec %i
  8567. 8567 }
  8568. 8568
  8569. 8569 if (%cleaned > 0) _barna_dbg JOIN_DELAY_GC limpiados= %cleaned restantes= $_barna_join_delay_count max= %max age= %age
  8570. 8570}
  8571. 8571
  8572. 8572alias _barna_join_delay_cancel {
  8573. 8573 if ($1 == $null) return
  8574. 8574
  8575. 8575 var %nick = $1
  8576. 8576 var %reason = $2-
  8577. 8577 var %ln = $lower(%nick)
  8578. 8578 var %timer = [ [ $+(%,barna_join_delay_timer.,%ln) ] ]
  8579. 8579
  8580. 8580 if (%timer == $null) var %timer = $_barna_join_delay_timer_name(%nick)
  8581. 8581 if (%timer != $null) .timer $+ %timer off
  8582. 8582
  8583. 8583 unset %barna_join_delay_timer. $+ %ln
  8584. 8584 unset %barna_join_delay_nick. $+ %ln
  8585. 8585 unset %barna_join_delay_chan. $+ %ln
  8586. 8586 unset %barna_join_delay_chans. $+ %ln
  8587. 8587 unset %barna_join_delay_ts. $+ %ln
  8588. 8588
  8589. 8589 if (%reason != $null) _barna_dbg JOIN_DELAY cancelado: nick= %nick reason= %reason
  8590. 8590}
  8591. 8591
  8592. 8592alias _barna_join_delay_schedule {
  8593. 8593 if ($1 == $null) return
  8594. 8594
  8595. 8595 var %nick = $1
  8596. 8596 var %chan = $_barna_chan_name_clean($2)
  8597. 8597 var %ln = $lower(%nick)
  8598. 8598
  8599. 8599 if (%nick == $me) return
  8600. 8600 if ($_barna_is_join_exception(%nick)) {
  8601. 8601 _barna_dbg EXCEPTIONSAFE JOIN_DELAY no programa por excepcion: nick= %nick canal= %chan
  8602. 8602 _barna_exception_cleanup_nick %nick
  8603. 8603 return
  8604. 8604 }
  8605. 8605
  8606. 8606 if ($_barna_is_privileged_nick(%nick)) {
  8607. 8607 _barna_dbg PRIVSAFE JOIN_DELAY no programa por @/+v: nick= %nick canal= %chan
  8608. 8608 _barna_privileged_cleanup_nick %nick JOIN_DELAY_ALREADY_PRIV
  8609. 8609 return
  8610. 8610 }
  8611. 8611
  8612. 8612 if ((%chan == $null) || (!$_barna_is_chan_enabled(%chan))) return
  8613. 8613
  8614. 8614 var %chans = $_barna_nick_enabled_chans(%nick)
  8615. 8615 if (%chans == $null) var %chans = $_barna_chan_list_clean_enabled(%chan)
  8616. 8616 if (%chans == $null) return
  8617. 8617
  8618. 8618 var %delay = %barna_join_delay_secs
  8619. 8619 if (%delay !isnum 1-10) var %delay = 4
  8620. 8620
  8621. 8621 ; Build 115: antes de programar, purgamos delays viejos y usamos
  8622. 8622 ; solo 2 variables por nick: chan + ts. El timer se puede recomputar.
  8623. 8623 noop $_barna_join_delay_gc_tick
  8624. 8624
  8625. 8625 var %timer = $_barna_join_delay_timer_name(%nick)
  8626. 8626 set -u30 %barna_join_delay_chan. $+ %ln %chan
  8627. 8627 set -u30 %barna_join_delay_nick. $+ %ln %nick
  8628. 8628 set -u30 %barna_join_delay_ts. $+ %ln $ctime
  8629. 8629
  8630. 8630 ; Compatibilidad: si venimos de builds 114/113, eliminar variables pesadas antiguas.
  8631. 8631 unset %barna_join_delay_timer. $+ %ln
  8632. 8632 unset %barna_join_delay_nick. $+ %ln
  8633. 8633 unset %barna_join_delay_chans. $+ %ln
  8634. 8634
  8635. 8635 .timer $+ %timer off
  8636. 8636 .timer $+ %timer 1 %delay _barna_join_delay_fire %nick
  8637. 8637
  8638. 8638 _barna_dbg JOIN_DELAY programado LIGHT: nick= %nick canal= %chan chans= %chans delay= %delay pending= $_barna_join_delay_count
  8639. 8639}
  8640. 8640
  8641. 8641alias _barna_join_delay_fire {
  8642. 8642 if ($1 == $null) return
  8643. 8643 if (%barna_addon != 1) return
  8644. 8644
  8645. 8645 var %nick = $1
  8646. 8646 var %ln = $lower(%nick)
  8647. 8647 var %chan = [ [ $+(%,barna_join_delay_chan.,%ln) ] ]
  8648. 8648 var %chans = $_barna_nick_enabled_chans(%nick)
  8649. 8649
  8650. 8650 ; Build 122: si un timer antiguo dispara tras haber sido procesado por PRESSURE, no duplicar.
  8651. 8651 if (%chan == $null) {
  8652. 8652 unset %barna_join_delay_timer. $+ %ln
  8653. 8653 unset %barna_join_delay_nick. $+ %ln
  8654. 8654 unset %barna_join_delay_chans. $+ %ln
  8655. 8655 unset %barna_join_delay_ts. $+ %ln
  8656. 8656 return
  8657. 8657 }
  8658. 8658
  8659. 8659 unset %barna_join_delay_timer. $+ %ln
  8660. 8660 unset %barna_join_delay_nick. $+ %ln
  8661. 8661 unset %barna_join_delay_chans. $+ %ln
  8662. 8662 unset %barna_join_delay_ts. $+ %ln
  8663. 8663
  8664. 8664 if ($_barna_is_join_exception(%nick)) {
  8665. 8665 _barna_dbg EXCEPTIONSAFE JOIN_DELAY vence pero nick es excepcion: nick= %nick
  8666. 8666 _barna_exception_cleanup_nick %nick
  8667. 8667 unset %barna_join_delay_chan. $+ %ln
  8668. 8668 return
  8669. 8669 }
  8670. 8670
  8671. 8671 if (%chans == $null) {
  8672. 8672 _barna_dbg JOIN_DELAY vence pero nick ya no esta en canal activo: nick= %nick
  8673. 8673 _barna_cleanup_leave %nick
  8674. 8674 unset %barna_join_delay_chan. $+ %ln
  8675. 8675 return
  8676. 8676 }
  8677. 8677
  8678. 8678 if ($_barna_is_privileged_nick(%nick)) {
  8679. 8679 _barna_dbg PRIVSAFE JOIN_DELAY vence y nick ya tiene @/+v: nick= %nick chans= %chans
  8680. 8680 _barna_privileged_cleanup_nick %nick JOIN_DELAY_PRIV
  8681. 8681 unset %barna_join_delay_chan. $+ %ln
  8682. 8682 return
  8683. 8683 }
  8684. 8684
  8685. 8685 if ((%chan == $null) || (!$istok(%chans,%chan,44))) var %chan = $gettok(%chans,1,44)
  8686. 8686 unset %barna_join_delay_chan. $+ %ln
  8687. 8687
  8688. 8688 _barna_join_process_now %nick %chan
  8689. 8689}
  8690. 8690
  8691. 8691alias _barna_join_process_now {
  8692. 8692 if ($1 == $null) return
  8693. 8693 if (%barna_addon != 1) return
  8694. 8694
  8695. 8695 var %nick = $1
  8696. 8696 var %chan = $_barna_chan_name_clean($2)
  8697. 8697 var %ln = $lower(%nick)
  8698. 8698
  8699. 8699 if ((%chan == $null) || (!$_barna_is_chan_enabled(%chan))) return
  8700. 8700
  8701. 8701 if ($_barna_is_join_exception(%nick)) {
  8702. 8702 _barna_dbg EXCEPTIONSAFE JOIN omitido por excepcion: nick= %nick canal= %chan
  8703. 8703 _barna_exception_cleanup_nick %nick
  8704. 8704 return
  8705. 8705 }
  8706. 8706
  8707. 8707 if ($_barna_is_privileged_nick(%nick)) {
  8708. 8708 _barna_dbg PRIVSAFE JOIN omitido por @/+v: nick= %nick canal= %chan
  8709. 8709 _barna_privileged_cleanup_nick %nick JOIN_PROCESS
  8710. 8710 return
  8711. 8711 }
  8712. 8712
  8713. 8713 unset %barna_abort. $+ %ln
  8714. 8714 unset %barna_privileged. $+ %ln
  8715. 8715
  8716. 8716 ; Build 115 JOINDELAY_LIGHTGC:
  8717. 8717 ; Esta parte solo se ejecuta cuando vence el delay de un JOIN real.
  8718. 8718 ; No viene de AUTONICKSCAN ni de recorrer nicklist.
  8719. 8719 var %chans = $_barna_nick_enabled_chans(%nick)
  8720. 8720 if (%chans == $null) var %chans = $_barna_chan_list_clean_enabled(%chan)
  8721. 8721 if (%chans == $null) return
  8722. 8722
  8723. 8723 ; Si ya conocemos IP+cache del nick, avisar/aplicar sin reconsultar.
  8724. 8724 var %lastip = $_barna_ip_get(%nick)
  8725. 8725 if (%lastip != $null) {
  8726. 8726 if ($_barna_asn_cache_apply(%nick,%lastip,%chans)) {
  8727. 8727 _barna_dbg JOIN usa cache ASN de nick ya conocido: nick= %nick ip= %lastip canal= %chan chans= %chans
  8728. 8728 return
  8729. 8729 }
  8730. 8730 }
  8731. 8731
  8732. 8732 if ([ [ $+(%,barna_badnick.,%ln) ] ] == 1) {
  8733. 8733 var %badip = [ [ $+(%,barna_badnick_ip.,%ln) ] ]
  8734. 8734 var %badscope = [ [ $+(%,barna_badnick_chans.,%ln) ] ]
  8735. 8735 var %livechans = $_barna_nick_enabled_chans(%nick)
  8736. 8736
  8737. 8737 if (%livechans == $null) var %livechans = $_barna_chan_list_clean_enabled(%chan)
  8738. 8738
  8739. 8739 var %matchchans = $_barna_chan_list_intersect_enabled(%livechans,%badscope)
  8740. 8740
  8741. 8741 if (%matchchans == $null) {
  8742. 8742 _barna_dbg JOIN badnick ignorado por scope de canal: nick= %nick ip= %badip canal= %chan live= %livechans badscope= %badscope seen= %chans
  8743. 8743 }
  8744. 8744 else {
  8745. 8745 if ($_barna_is_privileged_nick(%nick)) {
  8746. 8746 _barna_dbg PRIVSAFE JOIN badnick cancelado por @/+v tras delay: nick= %nick ip= %badip canal= %chan
  8747. 8747 _barna_privileged_cleanup_nick %nick JOIN_BADNICK_PRIV
  8748. 8748 return
  8749. 8749 }
  8750. 8750
  8751. 8751 _barna_dbg JOIN nick marcado como ASN positivo reciente en canal scope, SHUN inmediato y SAQUIT diferido: nick= %nick ip= %badip canal= %chan chans= %matchchans badscope= %badscope
  8752. 8752
  8753. 8753 if (%badip != $null) _barna_shun_ip %badip Molestias en Canales (A)
  8754. 8754 _barna_shun_nick %nick Molestias en Canales (A)
  8755. 8755
  8756. 8756 if (%badip != $null) {
  8757. 8757 var %msg_badnick = El usuario $chr(2) $+ %nick $+ $chr(15) (IP: $+ $chr(2) $+ %badip $+ $chr(15) $+ ) coincide con un nick cazado recientemente por ASN positivo
  8758. 8758 }
  8759. 8759 else {
  8760. 8760 var %msg_badnick = El usuario $chr(2) $+ %nick $+ $chr(15) (IP: desconocida) coincide con un nick cazado recientemente por ASN positivo
  8761. 8761 }
  8762. 8762
  8763. 8763 set -u900 %barna_hunted. $+ %ln 1
  8764. 8764 set -u900 %barna_saquit_showchans. $+ %ln $replace(%matchchans,$chr(44),$+(,$chr(32)))
  8765. 8765 set -u900 %barna_saquit_msg. $+ %ln %msg_badnick
  8766. 8766
  8767. 8767 if (%badip != $null) _barna_dbg Parseline2 pendiente hasta QUIT por badnick: nick= %nick ip= %badip chans= %matchchans
  8768. 8768 if (%badip != $null) _barna_schedule_delayed_saquit %nick %badip %matchchans
  8769. 8769 }
  8770. 8770 }
  8771. 8771
  8772. 8772 if ([ [ $+(%,barna_qry.,%ln) ] ] != $null) {
  8773. 8773 var %ttl = $_barna_userip_ttl
  8774. 8774
  8775. 8775 set $+(-u,%ttl) %barna_lookup. $+ %ln 1
  8776. 8776 set $+(-u,%ttl) %barna_lookup_chans. $+ %ln %chans
  8777. 8777
  8778. 8778 var %ida = [ [ $+(%,barna_q_active.,%ln) ] ]
  8779. 8779 var %idp = [ [ $+(%,barna_q_pending.,%ln) ] ]
  8780. 8780
  8781. 8781 if (%ida != $null) {
  8782. 8782 set -u90 %barna_q_chans. $+ %ida %chans
  8783. 8783 _barna_dbg JOIN ya en lookup, actualizo canales consulta activa: nick= %nick canal= %chan chans= %chans id= %ida
  8784. 8784 return
  8785. 8785 }
  8786. 8786
  8787. 8787 if (%idp != $null) {
  8788. 8788 set -u90 %barna_q_chans. $+ %idp %chans
  8789. 8789 _barna_dbg JOIN ya en lookup, actualizo canales consulta pendiente: nick= %nick canal= %chan chans= %chans id= %idp
  8790. 8790 _barna_q_schedule 1
  8791. 8791 return
  8792. 8792 }
  8793. 8793
  8794. 8794 if ([ [ $+(%,barna_ipdone.,%ln) ] ] != 1) {
  8795. 8795 _barna_dbg JOIN ya en lookup, actualizo cola WHOIP: nick= %nick canal= %chan chans= %chans
  8796. 8796 _barna_userip_q_add %nick
  8797. 8797 return
  8798. 8798 }
  8799. 8799
  8800. 8800 _barna_dbg JOIN ya en lookup pero sin cola activa, relanzo WHOIP: nick= %nick canal= %chan chans= %chans
  8801. 8801
  8802. 8802 unset %barna_ipdone. $+ %ln
  8803. 8803 _barna_lookup_start %nick
  8804. 8804 return
  8805. 8805 }
  8806. 8806
  8807. 8807 var %ttl2 = $_barna_userip_ttl
  8808. 8808 set $+(-u,%ttl2) %barna_qry. $+ %ln 1
  8809. 8809
  8810. 8810 _barna_dbg JOIN_DELAY ok tras espera: nick= %nick canal= %chan -> WHOIP
  8811. 8811
  8812. 8812 _barna_lookup_start %nick
  8813. 8813}
  8814. 8814
  8815. 8815on *:JOIN:#:{
  8816. 8816 if (%barna_addon != 1) halt
  8817. 8817 if (!$_barna_is_chan_enabled($chan)) halt
  8818. 8818
  8819. 8819 if ($_barna_is_join_exception($nick)) {
  8820. 8820 _barna_dbg EXCEPTIONSAFE JOIN omitido por excepcion: nick= $nick canal= $chan
  8821. 8821 _barna_exception_cleanup_nick $nick
  8822. 8822 halt
  8823. 8823 }
  8824. 8824
  8825. 8825 if ($_barna_is_privileged_nick($nick)) {
  8826. 8826 _barna_dbg PRIVSAFE JOIN omitido por @/+v: nick= $nick canal= $chan
  8827. 8827 _barna_privileged_cleanup_nick $nick JOIN
  8828. 8828 halt
  8829. 8829 }
  8830. 8830
  8831. 8831 ; Build 115: no consultar inmediatamente. Esperar por si el nick recibe +v/@.
  8832. 8832 _barna_join_delay_schedule $nick $chan
  8833. 8833}
  8834. 8834
  8835. 8835; ------------------------------------------------------------
  8836. 8836; BLOQUE 9A
  8837. 8837; WHOIP / RAW354
  8838. 8838; Build 86: RAW354IPNICK. RAW354 se acepta si trae IP + nick consultado esperado; nunca por FIFO ambiguo.
  8839. 8839; ------------------------------------------------------------
  8840. 8840
  8841. 8841alias -l _barna_whoip_clean_tok {
  8842. 8842 if ($1 == $null) return
  8843. 8843
  8844. 8844 var %t = $1
  8845. 8845
  8846. 8846 while ($left(%t,1) == :) {
  8847. 8847 var %t = $right(%t,-1)
  8848. 8848 }
  8849. 8849
  8850. 8850 return %t
  8851. 8851}
  8852. 8852
  8853. 8853alias -l _barna_whoip_is_expected_nick {
  8854. 8854 if ($1 == $null) return 0
  8855. 8855
  8856. 8856 var %ln = $lower($1)
  8857. 8857
  8858. 8858 ; Build 89:
  8859. 8859 ; No basta con lookup/qry para aceptar un RAW354. Esos estados pueden quedar
  8860. 8860 ; vivos tras cambios de nick, quits o rescates, y aceptar por ahi permite
  8861. 8861 ; duplicados/cruces. Solo aceptamos RAW354 de un nick que esta realmente
  8862. 8862 ; inflight o de una consulta manual activa.
  8863. 8863 if ([ [ $+(%,barna_manual_userip.,%ln) ] ] == 1) return 1
  8864. 8864 if ([ [ $+(%,barna_manual_wait.,%ln) ] ] == 1) return 1
  8865. 8865
  8866. 8866 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) {
  8867. 8867 if ($_barna_nick_enabled_chans($1) != $null) return 1
  8868. 8868 _barna_dbg RAW354 esperado pero nick ya no online en canal activo, limpio inflight: nick= $1
  8869. 8869 _barna_userip_q_release $1 RAW354_EXPECTED_OFFLINE
  8870. 8870 unset %barna_lookup. $+ %ln
  8871. 8871 unset %barna_lookup_chans. $+ %ln
  8872. 8872 unset %barna_qry. $+ %ln
  8873. 8873 unset %barna_ipdone. $+ %ln
  8874. 8874 return 0
  8875. 8875 }
  8876. 8876
  8877. 8877 return 0
  8878. 8878}
  8879. 8879
  8880. 8880alias -l _barna_whoip_315_inc {
  8881. 8881 var %ttl = $_barna_userip_ttl
  8882. 8882 var %p = %barna_whoip_315_pending
  8883. 8883
  8884. 8884 if (%ttl !isnum 30-) var %ttl = 90
  8885. 8885 if (%p !isnum 1-) var %p = 0
  8886. 8886
  8887. 8887 inc %p
  8888. 8888 set $+(-u,%ttl) %barna_whoip_315_pending %p
  8889. 8889}
  8890. 8890
  8891. 8891alias -l _barna_whoip_315_dec {
  8892. 8892 var %p = %barna_whoip_315_pending
  8893. 8893
  8894. 8894 if (%p !isnum 1-) return 0
  8895. 8895
  8896. 8896 dec %p
  8897. 8897
  8898. 8898 if (%p <= 0) unset %barna_whoip_315_pending
  8899. 8899 else set -u90 %barna_whoip_315_pending %p
  8900. 8900
  8901. 8901 return 1
  8902. 8902}
  8903. 8903
  8904. 8904alias -l _barna_whoip_315_done_inc {
  8905. 8905 var %ttl = $_barna_userip_ttl
  8906. 8906 var %p = %barna_whoip_315_done_pending
  8907. 8907
  8908. 8908 if (%ttl !isnum 30-) var %ttl = 90
  8909. 8909 if (%p !isnum 1-) var %p = 0
  8910. 8910
  8911. 8911 inc %p
  8912. 8912 set $+(-u,%ttl) %barna_whoip_315_done_pending %p
  8913. 8913}
  8914. 8914
  8915. 8915alias -l _barna_whoip_315_done_dec {
  8916. 8916 var %p = %barna_whoip_315_done_pending
  8917. 8917
  8918. 8918 if (%p !isnum 1-) return 0
  8919. 8919
  8920. 8920 dec %p
  8921. 8921
  8922. 8922 if (%p <= 0) unset %barna_whoip_315_done_pending
  8923. 8923 else set -u90 %barna_whoip_315_done_pending %p
  8924. 8924
  8925. 8925 return 1
  8926. 8926}
  8927. 8927
  8928. 8928alias -l _barna_whoip_fifo_add {
  8929. 8929 if ($1 == $null) return 0
  8930. 8930
  8931. 8931 var %nick = $1
  8932. 8932 var %ln = $lower(%nick)
  8933. 8933 var %ttl = $_barna_userip_ttl
  8934. 8934 var %tail = %barna_whoip_fifo_tail
  8935. 8935
  8936. 8936 if (%ttl !isnum 30-) var %ttl = 90
  8937. 8937 if (%tail == $null) var %tail = 0
  8938. 8938
  8939. 8939 inc %tail
  8940. 8940 set -u300 %barna_whoip_fifo_tail %tail
  8941. 8941
  8942. 8942 if (%barna_whoip_fifo_head == $null) set -u300 %barna_whoip_fifo_head 1
  8943. 8943
  8944. 8944 set $+(-u,%ttl) %barna_whoip_fifo_item. $+ %tail %nick
  8945. 8945 set $+(-u,%ttl) %barna_whoip_fifo_ln. $+ %tail %ln
  8946. 8946 set $+(-u,%ttl) %barna_whoip_expect. $+ %ln 1
  8947. 8947
  8948. 8948 return 1
  8949. 8949}
  8950. 8950
  8951. 8951alias -l _barna_whoip_fifo_count {
  8952. 8952 var %head = %barna_whoip_fifo_head
  8953. 8953 var %tail = %barna_whoip_fifo_tail
  8954. 8954 var %guard = 0
  8955. 8955 var %cnt = 0
  8956. 8956
  8957. 8957 if (%head == $null) return 0
  8958. 8958 if (%tail == $null) return 0
  8959. 8959
  8960. 8960 while ((%head <= %tail) && (%guard < 400)) {
  8961. 8961 inc %guard
  8962. 8962
  8963. 8963 if ([ [ $+(%,barna_whoip_fifo_item.,%head) ] ] != $null) inc %cnt
  8964. 8964
  8965. 8965 inc %head
  8966. 8966 }
  8967. 8967
  8968. 8968 return %cnt
  8969. 8969}
  8970. 8970
  8971. 8971alias -l _barna_whoip_fifo_pop {
  8972. 8972 var %head = %barna_whoip_fifo_head
  8973. 8973 var %tail = %barna_whoip_fifo_tail
  8974. 8974 var %guard = 0
  8975. 8975
  8976. 8976 if (%head == $null) return
  8977. 8977 if (%tail == $null) return
  8978. 8978
  8979. 8979 while ((%head <= %tail) && (%guard < 400)) {
  8980. 8980 inc %guard
  8981. 8981
  8982. 8982 var %nick = [ [ $+(%,barna_whoip_fifo_item.,%head) ] ]
  8983. 8983 var %ln = [ [ $+(%,barna_whoip_fifo_ln.,%head) ] ]
  8984. 8984
  8985. 8985 unset %barna_whoip_fifo_item. $+ %head
  8986. 8986 unset %barna_whoip_fifo_ln. $+ %head
  8987. 8987 set -u300 %barna_whoip_fifo_head $calc(%head + 1)
  8988. 8988
  8989. 8989 if (%nick != $null) {
  8990. 8990 if (%ln == $null) var %ln = $lower(%nick)
  8991. 8991 return %nick
  8992. 8992 }
  8993. 8993
  8994. 8994 inc %head
  8995. 8995 }
  8996. 8996
  8997. 8997 if (%head > %tail) {
  8998. 8998 unset %barna_whoip_fifo_head
  8999. 8999 unset %barna_whoip_fifo_tail
  9000. 9000 }
  9001. 9001}
  9002. 9002
  9003. 9003alias -l _barna_whoip_fifo_remove {
  9004. 9004 if ($1 == $null) return 0
  9005. 9005
  9006. 9006 var %ln_find = $lower($1)
  9007. 9007 var %head = %barna_whoip_fifo_head
  9008. 9008 var %tail = %barna_whoip_fifo_tail
  9009. 9009 var %guard = 0
  9010. 9010
  9011. 9011 if (%head == $null) return 0
  9012. 9012 if (%tail == $null) return 0
  9013. 9013
  9014. 9014 while ((%head <= %tail) && (%guard < 400)) {
  9015. 9015 inc %guard
  9016. 9016
  9017. 9017 var %nick = [ [ $+(%,barna_whoip_fifo_item.,%head) ] ]
  9018. 9018 var %ln = [ [ $+(%,barna_whoip_fifo_ln.,%head) ] ]
  9019. 9019
  9020. 9020 if (%nick != $null) {
  9021. 9021 if (%ln == $null) var %ln = $lower(%nick)
  9022. 9022
  9023. 9023 if (%ln == %ln_find) {
  9024. 9024 unset %barna_whoip_fifo_item. $+ %head
  9025. 9025 unset %barna_whoip_fifo_ln. $+ %head
  9026. 9026 unset %barna_whoip_expect. $+ %ln_find
  9027. 9027 return 1
  9028. 9028 }
  9029. 9029 }
  9030. 9030
  9031. 9031 inc %head
  9032. 9032 }
  9033. 9033
  9034. 9034 return 0
  9035. 9035}
  9036. 9036
  9037. 9037
  9038. 9038alias -l _barna_whoip_token_make {
  9039. 9039 ; Build 84:
  9040. 9040 ; Token WHOX unico por consulta. Solo alfanumerico para usarlo como sufijo de variable.
  9041. 9041 return $+(B,$ticks,$rand(100,999))
  9042. 9042}
  9043. 9043
  9044. 9044alias -l _barna_whoip_token_store {
  9045. 9045 if ($1 == $null) return 0
  9046. 9046 if ($2 == $null) return 0
  9047. 9047
  9048. 9048 var %tok = $1
  9049. 9049 var %nick = $2
  9050. 9050 var %ln = $lower(%nick)
  9051. 9051 var %ttl = $_barna_userip_ttl
  9052. 9052
  9053. 9053 if (%ttl !isnum 30-) var %ttl = 90
  9054. 9054
  9055. 9055 set $+(-u,%ttl) %barna_whoip_token_nick. $+ %tok %nick
  9056. 9056 set $+(-u,%ttl) %barna_whoip_token_ln. $+ %tok %ln
  9057. 9057 set $+(-u,%ttl) %barna_whoip_token_byln. $+ %ln %tok
  9058. 9058 return 1
  9059. 9059}
  9060. 9060
  9061. 9061alias -l _barna_whoip_token_find {
  9062. 9062 if ($1- == $null) return
  9063. 9063
  9064. 9064 var %raw = $1-
  9065. 9065 var %i = 1
  9066. 9066
  9067. 9067 while (%i <= $numtok(%raw,32)) {
  9068. 9068 var %tok = $_barna_whoip_clean_tok($gettok(%raw,%i,32))
  9069. 9069
  9070. 9070 if (%tok != $null) {
  9071. 9071 if ([ [ $+(%,barna_whoip_token_nick.,%tok) ] ] != $null) return %tok
  9072. 9072 }
  9073. 9073
  9074. 9074 inc %i
  9075. 9075 }
  9076. 9076}
  9077. 9077
  9078. 9078alias -l _barna_whoip_token_remove {
  9079. 9079 if ($1 == $null) return 0
  9080. 9080
  9081. 9081 var %tok = $1
  9082. 9082 var %ln = [ [ $+(%,barna_whoip_token_ln.,%tok) ] ]
  9083. 9083
  9084. 9084 unset %barna_whoip_token_nick. $+ %tok
  9085. 9085 unset %barna_whoip_token_ln. $+ %tok
  9086. 9086
  9087. 9087 if (%ln != $null) unset %barna_whoip_token_byln. $+ %ln
  9088. 9088
  9089. 9089 return 1
  9090. 9090}
  9091. 9091
  9092. 9092alias -l _barna_whoip_token_remove_nick {
  9093. 9093 if ($1 == $null) return 0
  9094. 9094
  9095. 9095 var %ln = $lower($1)
  9096. 9096 var %tok = [ [ $+(%,barna_whoip_token_byln.,%ln) ] ]
  9097. 9097
  9098. 9098 if (%tok != $null) return $_barna_whoip_token_remove(%tok)
  9099. 9099
  9100. 9100 return 0
  9101. 9101}
  9102. 9102
  9103. 9103
  9104. 9104; ------------------------------------------------------------
  9105. 9105; BLOQUE 8.9.2
  9106. 9106; WHOIP fallback: USERIP si WHO no devuelve RAW354/IP
  9107. 9107; ------------------------------------------------------------
  9108. 9108
  9109. 9109alias -l _barna_userip_fallback_send {
  9110. 9110 if ($1 == $null) return 0
  9111. 9111
  9112. 9112 var %nick = $1
  9113. 9113 var %reason = $2-
  9114. 9114 var %ln = $lower(%nick)
  9115. 9115 var %ttl = $_barna_userip_ttl
  9116. 9116 var %chans = $_barna_nick_enabled_chans(%nick)
  9117. 9117
  9118. 9118 if (%ttl !isnum 30-) var %ttl = 90
  9119. 9119 if (%chans == $null) var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  9120. 9120 if (%chans == $null) return 0
  9121. 9121
  9122. 9122 ; Evita bucles: un fallback por nick cada 45 segundos.
  9123. 9123 if ([ [ $+(%,barna_userip_fallback_recent.,%ln) ] ] == 1) return 0
  9124. 9124
  9125. 9125 set -u45 %barna_userip_fallback_recent. $+ %ln 1
  9126. 9126
  9127. 9127 ; Liberamos solo el inflight WHO/RAW354, pero mantenemos lookup/qry para que RAW340
  9128. 9128 ; pueda cerrar el ciclo con _barna_ip_found si USERIP devuelve IP.
  9129. 9129 _barna_userip_q_release %nick USERIP_FALLBACK_FROM_ $+ %reason
  9130. 9130
  9131. 9131 set $+(-u,%ttl) %barna_lookup. $+ %ln 1
  9132. 9132 set $+(-u,%ttl) %barna_lookup_chans. $+ %ln %chans
  9133. 9133 set $+(-u,%ttl) %barna_qry. $+ %ln 1
  9134. 9134 unset %barna_ipdone. $+ %ln
  9135. 9135
  9136. 9136 _barna_dbg USERIP FALLBACK enviado: nick= %nick chans= %chans reason= %reason
  9137. 9137 .userip %nick
  9138. 9138
  9139. 9139 return 1
  9140. 9140}
  9141. 9141
  9142. 9142alias -l _barna_whoip_next_fast {
  9143. 9143 ; Build 79:
  9144. 9144 ; Encadena el siguiente WHOIP justo al liberar el inflight actual.
  9145. 9145 ; Mantiene 1 inflight real para no cruzar nick/IP, pero evita esperar
  9146. 9146 ; al siguiente tick del timer cuando ya hay respuesta RAW354/315/401.
  9147. 9147 if (%barna_addon != 1) return 0
  9148. 9148 if (%barna_whoip_next_busy == 1) return 0
  9149. 9149 if ($_barna_userip_q_count <= 0) return 0
  9150. 9150
  9151. 9151 var %running = %barna_userip_inflight_count
  9152. 9152 if (%running == $null) var %running = 0
  9153. 9153 if (%running > 0) return 0
  9154. 9154
  9155. 9155 set -u2 %barna_whoip_next_busy 1
  9156. 9156 _barna_userip_q_process
  9157. 9157 unset %barna_whoip_next_busy
  9158. 9158 return 1
  9159. 9159}
  9160. 9160
  9161. 9161alias -l _barna_whoip_send {
  9162. 9162 if ($1 == $null) return 0
  9163. 9163
  9164. 9164 var %nick = $1
  9165. 9165 var %ln = $lower(%nick)
  9166. 9166 var %ttl = $_barna_userip_ttl
  9167. 9167
  9168. 9168 if (%ttl !isnum 30-) var %ttl = 90
  9169. 9169
  9170. 9170 ; Build 100: no bloquear por WHO actual vivo.
  9171. 9171 ; El 99 dejaba la cola muda si current_ln no se liberaba rapido. Como RAW354 trae
  9172. 9172 ; IP + nickConsultado, podemos enviar el siguiente WHO y mapear por nick inflight.
  9173. 9173
  9174. 9174 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] == 1) {
  9175. 9175 _barna_dbg WHOIP SEND omitido por inflight existente: nick= %nick
  9176. 9176 return 0
  9177. 9177 }
  9178. 9178
  9179. 9179 ; Build 100: sin FIFO/token; RAW354 se valida por nick inflight esperado.
  9180. 9180 ; Guardamos solo el nick actual para RAW315/401 y validamos RAW354 por inflight+nick.
  9181. 9181 unset %barna_whoip_current_nick
  9182. 9182 unset %barna_whoip_current_ln
  9183. 9183 unset %barna_whoip_315_done_pending
  9184. 9184
  9185. 9185 set $+(-u,%ttl) %barna_whoip_current_nick %nick
  9186. 9186 set $+(-u,%ttl) %barna_whoip_current_ln %ln
  9187. 9187 noop $_barna_whoip_315_inc
  9188. 9188
  9189. 9189 set $+(-u,%ttl) %barna_userip_inflight. $+ %ln 1
  9190. 9190 _barna_userip_inflight_inc
  9191. 9191
  9192. 9192 set $+(-u,%ttl) %barna_whoip_sent. $+ %ln 1
  9193. 9193
  9194. 9194 .raw -q WHO %nick $+(n,$chr(37),ni)
  9195. 9195
  9196. 9196 ; Build 116: watchdog automatico para WHO lanzado por JOIN/cola.
  9197. 9197 ; Si no llega RAW354/IP, prueba USERIP fallback y finalmente limpia el estado
  9198. 9198 ; para no dejar lookup/qry/sent_recent fantasma ni depender de /barna.trace.
  9199. 9199 var %hk = $md5(%ln,0)
  9200. 9200 var %tw = BarnaWHOIPChk_ $+ %hk
  9201. 9201 var %wd = %barna_whoip_watchdog_secs
  9202. 9202 if (%wd !isnum 5-) var %wd = 8
  9203. 9203 .timer $+ %tw off
  9204. 9204 .timer $+ %tw 1 %wd _barna_whoip_send_check %nick
  9205. 9205
  9206. 9206 return 1
  9207. 9207}
  9208. 9208
  9209. 9209alias -l _barna_whoip_send_check {
  9210. 9210 if ($1 == $null) return 0
  9211. 9211
  9212. 9212 var %nick = $1
  9213. 9213 var %ln = $lower(%nick)
  9214. 9214 var %chans = $_barna_nick_enabled_chans(%nick)
  9215. 9215
  9216. 9216 if ($_barna_is_join_exception(%nick)) {
  9217. 9217 _barna_dbg EXCEPTIONSAFE WHOIP WATCHDOG omite nick exceptuado: nick= %nick
  9218. 9218 _barna_exception_cleanup_nick %nick
  9219. 9219 return 0
  9220. 9220 }
  9221. 9221
  9222. 9222 if ($_barna_is_privileged_nick(%nick)) {
  9223. 9223 _barna_dbg PRIVSAFE WHOIP WATCHDOG cancela por @/+v: nick= %nick
  9224. 9224 _barna_privileged_cleanup_nick %nick WHOIP_WATCHDOG
  9225. 9225 return 0
  9226. 9226 }
  9227. 9227
  9228. 9228 if (%chans == $null) {
  9229. 9229 _barna_dbg WHOIP WATCHDOG limpia offline/sin canal activo: nick= %nick
  9230. 9230 _barna_userip_q_release %nick WHOIP_WATCHDOG_OFFLINE
  9231. 9231 unset %barna_lookup. $+ %ln
  9232. 9232 unset %barna_lookup_chans. $+ %ln
  9233. 9233 unset %barna_qry. $+ %ln
  9234. 9234 unset %barna_ipdone. $+ %ln
  9235. 9235 unset %barna_userip_sent_recent. $+ %ln
  9236. 9236 unset %barna_userip_fallback_recent. $+ %ln
  9237. 9237 return 0
  9238. 9238 }
  9239. 9239
  9240. 9240 if ($_barna_fast_asn_if_ip_ready(%nick,WHOIP_WATCHDOG_IP_READY)) return 1
  9241. 9241
  9242. 9242 var %ip = $_barna_ip_get(%nick)
  9243. 9243 if (%ip != $null) {
  9244. 9244 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  9245. 9245 _barna_dbg WHOIP WATCHDOG aplica cache: nick= %nick ip= %ip chans= %chans
  9246. 9246 _barna_userip_q_release %nick WHOIP_WATCHDOG_CACHE
  9247. 9247 unset %barna_lookup. $+ %ln
  9248. 9248 unset %barna_lookup_chans. $+ %ln
  9249. 9249 unset %barna_qry. $+ %ln
  9250. 9250 unset %barna_ipdone. $+ %ln
  9251. 9251 unset %barna_userip_sent_recent. $+ %ln
  9252. 9252 return 1
  9253. 9253 }
  9254. 9254
  9255. 9255 if ($_barna_trace_queue_find(%nick) == $null) {
  9256. 9256 _barna_dbg WHOIP WATCHDOG envia IP a ASN: nick= %nick ip= %ip chans= %chans
  9257. 9257 _barna_userip_q_release %nick WHOIP_WATCHDOG_IP_TO_ASN
  9258. 9258 unset %barna_lookup. $+ %ln
  9259. 9259 unset %barna_qry. $+ %ln
  9260. 9260 unset %barna_ipdone. $+ %ln
  9261. 9261 unset %barna_userip_sent_recent. $+ %ln
  9262. 9262 _barna_q_add %nick %ip %chans
  9263. 9263 _barna_q_process
  9264. 9264 _barna_asn_pump_start_if_needed
  9265. 9265 return 1
  9266. 9266 }
  9267. 9267 }
  9268. 9268
  9269. 9269 var %qid = $_barna_trace_queue_find(%nick)
  9270. 9270 if (%qid == $null) {
  9271. 9271 _barna_dbg WHOIP WATCHDOG sin IP/RAW354: nick= %nick chans= %chans
  9272. 9272 _barna_userip_q_release %nick WHOIP_WATCHDOG_STALE_NO_RAW354
  9273. 9273 unset %barna_whoip_current_nick
  9274. 9274 unset %barna_whoip_current_ln
  9275. 9275 unset %barna_whoip_315_done_pending
  9276. 9276
  9277. 9277 if ([ [ $+(%,barna_userip_fallback_recent.,%ln) ] ] != 1) {
  9278. 9278 if ($_barna_userip_fallback_send(%nick,WHOIP_WATCHDOG_STALE_NO_RAW354)) {
  9279. 9279 var %hk2 = $md5(%ln,0)
  9280. 9280 var %tw2 = BarnaWHOIPChk_ $+ %hk2
  9281. 9281 var %wd2 = %barna_whoip_watchdog_fallback_secs
  9282. 9282 if (%wd2 !isnum 6-) var %wd2 = 10
  9283. 9283 .timer $+ %tw2 1 %wd2 _barna_whoip_send_check %nick
  9284. 9284 return 1
  9285. 9285 }
  9286. 9286 }
  9287. 9287
  9288. 9288 _barna_dbg WHOIP WATCHDOG limpia lookup/qry fantasma sin IP: nick= %nick chans= %chans
  9289. 9289 _barna_userip_q_release %nick WHOIP_WATCHDOG_STUCK_CLEAN
  9290. 9290 unset %barna_lookup. $+ %ln
  9291. 9291 unset %barna_lookup_chans. $+ %ln
  9292. 9292 unset %barna_qry. $+ %ln
  9293. 9293 unset %barna_ipdone. $+ %ln
  9294. 9294 unset %barna_userip_sent_recent. $+ %ln
  9295. 9295 unset %barna_seen_rescue_recent. $+ %ln
  9296. 9296 unset %barna_userip_fallback_recent. $+ %ln
  9297. 9297 return 0
  9298. 9298 }
  9299. 9299
  9300. 9300 return 0
  9301. 9301}
  9302. 9302
  9303. 9303RAW 354:*:{
  9304. 9304 if (%barna_addon != 1) return
  9305. 9305
  9306. 9306 var %raw = $1-
  9307. 9307 var %ip
  9308. 9308 var %nick
  9309. 9309 var %i = 1
  9310. 9310
  9311. 9311 ; Build 86:
  9312. 9312 ; Formato real observado en esta red:
  9313. 9313 ; 354 : <mi_nick> <ip> <nick_consultado>
  9314. 9314 ; Por tanto, cuando encontramos la IP preferimos el token posterior si
  9315. 9315 ; corresponde a un nick esperado por el addon. Como compatibilidad,
  9316. 9316 ; tambien aceptamos el token anterior si ese es el esperado.
  9317. 9317 while (%i <= $numtok(%raw,32)) {
  9318. 9318 var %tokraw = $_barna_whoip_clean_tok($gettok(%raw,%i,32))
  9319. 9319
  9320. 9320 if ($_barna_is_ipv4(%tokraw)) {
  9321. 9321 var %ip = %tokraw
  9322. 9322 var %nick_after
  9323. 9323 var %nick_before
  9324. 9324
  9325. 9325 if (%i < $numtok(%raw,32)) {
  9326. 9326 var %p_after = $calc(%i + 1)
  9327. 9327 var %nick_after = $_barna_whoip_clean_tok($gettok(%raw,%p_after,32))
  9328. 9328 }
  9329. 9329
  9330. 9330 if (%i > 1) {
  9331. 9331 var %p_before = $calc(%i - 1)
  9332. 9332 var %nick_before = $_barna_whoip_clean_tok($gettok(%raw,%p_before,32))
  9333. 9333 }
  9334. 9334
  9335. 9335 if ($_barna_whoip_is_expected_nick(%nick_after)) var %nick = %nick_after
  9336. 9336 elseif ($_barna_whoip_is_expected_nick(%nick_before)) var %nick = %nick_before
  9337. 9337
  9338. 9338 break
  9339. 9339 }
  9340. 9340
  9341. 9341 inc %i
  9342. 9342 }
  9343. 9343
  9344. 9344 ; Si no trae IP, no es respuesta ASN del addon. Dejar pasar para no romper
  9345. 9345 ; WHOWAS/clones u otros WHOX manuales.
  9346. 9346 if (%ip == $null) return
  9347. 9347 if (%nick == $null) {
  9348. 9348 _barna_dbg RAW354 RAW354IPNICK ignorado sin nick esperado: ip= %ip raw= %raw
  9349. 9349 return
  9350. 9350 }
  9351. 9351
  9352. 9352 var %ln = $lower(%nick)
  9353. 9353
  9354. 9354 ; Anti-cruce estricto:
  9355. 9355 ; Solo aceptamos el RAW354 si el nick consultado que trae la linea esta
  9356. 9356 ; esperado por el addon. Nunca asignamos por FIFO si el nick no coincide.
  9357. 9357 if (!$_barna_whoip_is_expected_nick(%nick)) {
  9358. 9358 _barna_dbg RAW354 RAW354IPNICK ignorado sin nick esperado: nick= %nick ip= %ip raw= %raw
  9359. 9359 return
  9360. 9360 }
  9361. 9361
  9362. 9362 ; Build 94: limpiar marcador inflight unico.
  9363. 9363 unset %barna_whoip_current_nick
  9364. 9364 unset %barna_whoip_current_ln
  9365. 9365
  9366. 9366 ; Este WHO ya obtuvo RAW354 con IP. El RAW315 posterior solo debe caparse.
  9367. 9367 noop $_barna_whoip_315_done_inc
  9368. 9368
  9369. 9369 _barna_dbg RAW354 RAW354IPNICK recibido WHOIP: nick= %nick ip= %ip raw= %raw
  9370. 9370
  9371. 9371 if ([ [ $+(%,barna_manual_userip.,%ln) ] ] == 1) {
  9372. 9372 var %uwin = [ [ $+(%,barna_manual_userip_win.,%ln) ] ]
  9373. 9373 if (%uwin == $null) var %uwin = Status Window
  9374. 9374 echo %uwin $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) WHOIP $chr(2) $+ %nick $+ $chr(15) -> $chr(2) $+ %ip $+ $chr(15)
  9375. 9375 unset %barna_manual_userip. $+ %ln
  9376. 9376 unset %barna_manual_userip_win. $+ %ln
  9377. 9377 }
  9378. 9378
  9379. 9379 if ([ [ $+(%,barna_manual_wait.,%ln) ] ] == 1) {
  9380. 9380 var %id = asnmanual_ $+ $ticks
  9381. 9381 var %win = [ [ $+(%,barna_manual_win_nick.,%ln) ] ]
  9382. 9382
  9383. 9383 if (%win == $null) var %win = Status Window
  9384. 9384
  9385. 9385 unset %barna_manual_wait. $+ %ln
  9386. 9386 unset %barna_manual_win_nick. $+ %ln
  9387. 9387
  9388. 9388 set -u30 %barna_manual_ip. $+ %id %ip
  9389. 9389 set -u30 %barna_manual_win. $+ %id %win
  9390. 9390 unset %barna_manual_asn. $+ %id
  9391. 9391 unset %barna_manual_name. $+ %id
  9392. 9392 unset %barna_manual_done. $+ %id
  9393. 9393
  9394. 9394 sockopen -e %id api.ipinfo.io 443
  9395. 9395 _barna_userip_q_release %nick RAW354_RAW354IPNICK_MANUAL
  9396. 9396 }
  9397. 9397 else {
  9398. 9398 _barna_ip_found %nick %ip RAW354_RAW354IPNICK
  9399. 9399 }
  9400. 9400
  9401. 9401 haltdef
  9402. 9402 halt
  9403. 9403}
  9404. 9404RAW 315:*:{
  9405. 9405 if (%barna_addon != 1) return
  9406. 9406
  9407. 9407 if (%barna_whoip_315_pending isnum 1-) {
  9408. 9408 noop $_barna_whoip_315_dec
  9409. 9409
  9410. 9410 ; Build 79:
  9411. 9411 ; Si este 315 corresponde a un WHO que ya tuvo RAW354, solo lo capamos.
  9412. 9412 ; Importante: al encadenar rapido, el siguiente WHO puede estar ya en FIFO.
  9413. 9413 ; No debemos liberar ese FIFO con el 315 tardio del WHO anterior.
  9414. 9414 if ($_barna_whoip_315_done_dec) {
  9415. 9415 haltdef
  9416. 9416 halt
  9417. 9417 }
  9418. 9418
  9419. 9419 ; Si termina el WHO y no hemos recibido RAW354 con IP, liberamos el unico
  9420. 9420 ; inflight pendiente. Build 94: usar marcador current, no FIFO.
  9421. 9421 var %nick = %barna_whoip_current_nick
  9422. 9422
  9423. 9423 if (%nick != $null) {
  9424. 9424 var %ln = $lower(%nick)
  9425. 9425
  9426. 9426 ; Build 102:
  9427. 9427 ; Si WHO termina sin RAW354/IP, no damos el nick por perdido inmediatamente.
  9428. 9428 ; Probamos USERIP una vez como fallback; RAW340 ya esta soportado por el addon.
  9429. 9429 if ($_barna_userip_fallback_send(%nick,RAW315_NO_RAW354)) {
  9430. 9430 unset %barna_whoip_current_nick
  9431. 9431 unset %barna_whoip_current_ln
  9432. 9432 haltdef
  9433. 9433 halt
  9434. 9434 }
  9435. 9435
  9436. 9436 _barna_dbg RAW315 WHOIP sin RAW354 ni fallback, libero inflight: nick= %nick raw= $1-
  9437. 9437 _barna_userip_q_release %nick RAW315_NO_RAW354
  9438. 9438 unset %barna_lookup. $+ %ln
  9439. 9439 unset %barna_lookup_chans. $+ %ln
  9440. 9440 unset %barna_qry. $+ %ln
  9441. 9441 unset %barna_ipdone. $+ %ln
  9442. 9442 unset %barna_userip_retry. $+ %ln
  9443. 9443 unset %barna_userip_sent_recent. $+ %ln
  9444. 9444 unset %barna_whoip_current_nick
  9445. 9445 unset %barna_whoip_current_ln
  9446. 9446 }
  9447. 9447
  9448. 9448 haltdef
  9449. 9449 halt
  9450. 9450 }
  9451. 9451}
  9452. 9452
  9453. 9453RAW 401:*:{
  9454. 9454 if (%barna_addon != 1) return
  9455. 9455
  9456. 9456 var %target = $_barna_whoip_clean_tok($2)
  9457. 9457 if (%target == $null) var %target = $_barna_whoip_clean_tok($1)
  9458. 9458 if (%target == $null) return
  9459. 9459
  9460. 9460 var %ln = $lower(%target)
  9461. 9461
  9462. 9462 if ([ [ $+(%,barna_userip_inflight.,%ln) ] ] != 1) return
  9463. 9463
  9464. 9464 unset %barna_whoip_current_nick
  9465. 9465 unset %barna_whoip_current_ln
  9466. 9466
  9467. 9467 _barna_dbg RAW401 WHOIP nick no online: nick= %target raw= $1-
  9468. 9468
  9469. 9469 _barna_userip_q_release %target RAW401_WHOIP
  9470. 9470 unset %barna_lookup. $+ %ln
  9471. 9471 unset %barna_lookup_chans. $+ %ln
  9472. 9472 unset %barna_qry. $+ %ln
  9473. 9473 unset %barna_ipdone. $+ %ln
  9474. 9474 unset %barna_userip_retry. $+ %ln
  9475. 9475 unset %barna_userip_sent_recent. $+ %ln
  9476. 9476
  9477. 9477 haltdef
  9478. 9478 halt
  9479. 9479}
  9480. 9480
  9481. 9481; ------------------------------------------------------------
  9482. 9482; BLOQUE 9
  9483. 9483; RAW USERIP COMPATIBILIDAD
  9484. 9484; ------------------------------------------------------------
  9485. 9485
  9486. 9486RAW 340:*:{
  9487. 9487 if (%barna_addon != 1) return
  9488. 9488
  9489. 9489 var %all = $2-
  9490. 9490 var %i = 1
  9491. 9491
  9492. 9492 while (%i <= $numtok(%all,32)) {
  9493. 9493 var %raw_data = $gettok(%all,%i,32)
  9494. 9494
  9495. 9495 if ($left(%raw_data,1) == :) var %raw_data = $right(%raw_data,-1)
  9496. 9496
  9497. 9497 var %address = $gettok(%raw_data,2,64)
  9498. 9498 var %nick_full = $gettok(%raw_data,1,64)
  9499. 9499 var %nick = $gettok(%nick_full,1,61)
  9500. 9500
  9501. 9501 while ($right(%nick,1) == *) {
  9502. 9502 var %nick = $left(%nick,-1)
  9503. 9503 }
  9504. 9504
  9505. 9505 if (%nick != $null) {
  9506. 9506 _barna_dbg RAW340 recibido: nick= %nick ip= %address
  9507. 9507
  9508. 9508 if (%address == 127.0.0.1) || (%address == $null) || ("*" isin %address) {
  9509. 9509 if ([ [ $+(%,barna_manual_userip.,$lower(%nick)) ] ] == 1) {
  9510. 9510 var %uwin_bad = [ [ $+(%,barna_manual_userip_win.,$lower(%nick)) ] ]
  9511. 9511 if (%uwin_bad == $null) var %uwin_bad = Status Window
  9512. 9512 echo %uwin_bad $timestamp $chr(3) $+ 4 $+ [ASN] $chr(15) WHOIP $chr(2) $+ %nick $+ $chr(15) sin IP valida: %address
  9513. 9513 unset %barna_manual_userip. $+ $lower(%nick)
  9514. 9514 unset %barna_manual_userip_win. $+ $lower(%nick)
  9515. 9515 }
  9516. 9516
  9517. 9517 _barna_dbg RAW340 ignorado: nick= %nick ip= %address
  9518. 9518 _barna_userip_q_release %nick RAW340_INVALID
  9519. 9519 unset %barna_lookup. $+ $lower(%nick)
  9520. 9520 unset %barna_lookup_chans. $+ $lower(%nick)
  9521. 9521 unset %barna_qry. $+ $lower(%nick)
  9522. 9522 unset %barna_ipdone. $+ $lower(%nick)
  9523. 9523 unset %barna_userip_retry. $+ $lower(%nick)
  9524. 9524 }
  9525. 9525 else {
  9526. 9526 if ([ [ $+(%,barna_manual_userip.,$lower(%nick)) ] ] == 1) {
  9527. 9527 var %uwin = [ [ $+(%,barna_manual_userip_win.,$lower(%nick)) ] ]
  9528. 9528 if (%uwin == $null) var %uwin = Status Window
  9529. 9529 echo %uwin $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) WHOIP $chr(2) $+ %nick $+ $chr(15) -> $chr(2) $+ %address $+ $chr(15)
  9530. 9530 unset %barna_manual_userip. $+ $lower(%nick)
  9531. 9531 unset %barna_manual_userip_win. $+ $lower(%nick)
  9532. 9532 }
  9533. 9533
  9534. 9534 if ([ [ $+(%,barna_manual_wait.,$lower(%nick)) ] ] == 1) {
  9535. 9535 var %id = asnmanual_ $+ $ticks
  9536. 9536 var %win = [ [ $+(%,barna_manual_win_nick.,$lower(%nick)) ] ]
  9537. 9537
  9538. 9538 if (%win == $null) var %win = Status Window
  9539. 9539
  9540. 9540 unset %barna_manual_wait. $+ $lower(%nick)
  9541. 9541 unset %barna_manual_win_nick. $+ $lower(%nick)
  9542. 9542
  9543. 9543 set -u30 %barna_manual_ip. $+ %id %address
  9544. 9544 set -u30 %barna_manual_win. $+ %id %win
  9545. 9545 unset %barna_manual_asn. $+ %id
  9546. 9546 unset %barna_manual_name. $+ %id
  9547. 9547 unset %barna_manual_done. $+ %id
  9548. 9548
  9549. 9549 sockopen -e %id api.ipinfo.io 443
  9550. 9550 }
  9551. 9551 else {
  9552. 9552 _barna_ip_found %nick %address RAW340
  9553. 9553 }
  9554. 9554 }
  9555. 9555 }
  9556. 9556
  9557. 9557 inc %i
  9558. 9558 }
  9559. 9559
  9560. 9560 halt
  9561. 9561}
  9562. 9562
  9563. 9563; ------------------------------------------------------------
  9564. 9564; BLOQUE 9.2.5
  9565. 9565; CACHE TEMPORAL DE RESULTADOS ASN
  9566. 9566; ------------------------------------------------------------
  9567. 9567
  9568. 9568alias _barna_asn_cache_key {
  9569. 9569 if ($1 == $null) return
  9570. 9570 return $replace($1,.,_)
  9571. 9571}
  9572. 9572
  9573. 9573; Build 123:
  9574. 9574; Las entradas marcadas por CACHECAP MARKGC usan __gc__ durante 1 segundo
  9575. 9575; antes de expirar. Nunca deben considerarse cache valida ni generar aviso/sancion.
  9576. 9576alias _barna_asn_cache_val_ok {
  9577. 9577 if ($1 == $null) return 0
  9578. 9578 if ($1 == __gc__) return 0
  9579. 9579 if ($1 == 0) return 0
  9580. 9580 return 1
  9581. 9581}
  9582. 9582
  9583. 9583alias _barna_asn_cache_key_valid {
  9584. 9584 if ($1 == $null) return 0
  9585. 9585 var %key = $1
  9586. 9586 var %asn = [ [ $+(%,barna_asn_cache_asn.,%key) ] ]
  9587. 9587 var %isp = [ [ $+(%,barna_asn_cache_name.,%key) ] ]
  9588. 9588 if (!$_barna_asn_cache_val_ok(%asn)) return 0
  9589. 9589 if (!$_barna_asn_cache_val_ok(%isp)) return 0
  9590. 9590 if ($left(%asn,2) != AS) return 0
  9591. 9591 return 1
  9592. 9592}
  9593. 9593
  9594. 9594alias _barna_asn_cache_ip_valid {
  9595. 9595 if ($1 == $null) return 0
  9596. 9596 var %key = $_barna_asn_cache_key($1)
  9597. 9597 if (%key == $null) return 0
  9598. 9598 return $_barna_asn_cache_key_valid(%key)
  9599. 9599}
  9600. 9600
  9601. 9601alias _barna_asn_cache_store {
  9602. 9602 if ($1 == $null) return
  9603. 9603 if ($2 == $null) return
  9604. 9604
  9605. 9605 var %ip = $1
  9606. 9606 var %asn = $2
  9607. 9607 var %isp = $3-
  9608. 9608 var %ttl = %barna_asn_cache_ttl
  9609. 9609 var %key = $_barna_asn_cache_key(%ip)
  9610. 9610
  9611. 9611 if (%ttl !isnum 300-) var %ttl = 21600
  9612. 9612 if (%key == $null) return
  9613. 9613 if (%isp == $null) var %isp = Desconocido
  9614. 9614
  9615. 9615 ; Build 120: si la cache ya esta por encima del hard limit y esta IP no
  9616. 9616 ; estaba cacheada, NO guardamos una entrada nueva. Asi el drenaje puede bajar
  9617. 9617 ; de verdad en horas de mucho trafico. Si la IP ya existe, se permite refrescar.
  9618. 9618 if (%barna_cachecap117_enabled == 1) {
  9619. 9619 _barna_cachecap117_defaults
  9620. 9620 var %cache_count = $var(%barna_asn_cache_asn.*,0)
  9621. 9621 var %exists = 0
  9622. 9622 if ($_barna_asn_cache_key_valid(%key)) var %exists = 1
  9623. 9623
  9624. 9624 if ((%cache_count >= %barna_asn_cache_hard_limit) && (%exists == 0)) {
  9625. 9625 inc %barna_cachecap117_skip_new
  9626. 9626 set -u60 %barna_cachecap117_last_skip %key
  9627. 9627 noop $_barna_cachecap117_start_drain
  9628. 9628 _barna_dbg ASN CACHE skip por cap: ip= %ip asn= %asn cache= %cache_count hard= %barna_asn_cache_hard_limit
  9629. 9629 return
  9630. 9630 }
  9631. 9631 }
  9632. 9632
  9633. 9633 set $+(-u,%ttl) %barna_asn_cache_asn. $+ %key %asn
  9634. 9634 set $+(-u,%ttl) %barna_asn_cache_name. $+ %key %isp
  9635. 9635 set $+(-u,%ttl) %barna_asn_cache_ts. $+ %key $ctime
  9636. 9636
  9637. 9637 if (%barna_cachecap117_enabled == 1) {
  9638. 9638 if ($var(%barna_asn_cache_asn.*,0) > %barna_asn_cache_hard_limit) noop $_barna_cachecap117_start_drain
  9639. 9639 }
  9640. 9640
  9641. 9641 _barna_dbg ASN CACHE store: ip= %ip asn= %asn ttl= %ttl
  9642. 9642}
  9643. 9643
  9644. 9644alias _barna_asn_cache_apply {
  9645. 9645 if ($1 == $null) return 0
  9646. 9646 if ($2 == $null) return 0
  9647. 9647
  9648. 9648 var %nick = $1
  9649. 9649 var %ip = $2
  9650. 9650 var %chans = $3-
  9651. 9651 var %key = $_barna_asn_cache_key(%ip)
  9652. 9652
  9653. 9653 if ($_barna_is_join_exception(%nick)) {
  9654. 9654 _barna_dbg EXCEPTIONSAFE ignora cache ASN para nick exceptuado: nick= %nick ip= %ip chans= %chans
  9655. 9655 _barna_exception_cleanup_nick %nick
  9656. 9656 return 1
  9657. 9657 }
  9658. 9658
  9659. 9659 if ($_barna_is_privileged_nick(%nick)) {
  9660. 9660 _barna_dbg PRIVSAFE ignora cache ASN por @/+v: nick= %nick ip= %ip chans= %chans
  9661. 9661 _barna_privileged_cleanup_nick %nick CACHE_APPLY
  9662. 9662 return 1
  9663. 9663 }
  9664. 9664
  9665. 9665 if (%key == $null) return 0
  9666. 9666
  9667. 9667 var %asn = [ [ $+(%,barna_asn_cache_asn.,%key) ] ]
  9668. 9668 var %isp = [ [ $+(%,barna_asn_cache_name.,%key) ] ]
  9669. 9669
  9670. 9670 ; Build 123: nunca aplicar cache marcada por MARKGC (__gc__).
  9671. 9671 if (!$_barna_asn_cache_val_ok(%asn)) return 0
  9672. 9672 if (!$_barna_asn_cache_val_ok(%isp)) return 0
  9673. 9673 if ($left(%asn,2) != AS) return 0
  9674. 9674
  9675. 9675 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  9676. 9676
  9677. 9677 var %allchans = $_barna_echo_chans_for_nick(%nick,%chans)
  9678. 9678 if (%allchans != $null) var %chans = %allchans
  9679. 9679
  9680. 9680 if (%chans == $null) return 0
  9681. 9681
  9682. 9682 _barna_dbg ASN CACHE hit: nick= %nick ip= %ip asn= %asn chans= %chans
  9683. 9683
  9684. 9684 var %dnick = $_barna_nick_display(%nick)
  9685. 9685 var %mensaje = El usuario $chr(2) $+ %dnick $+ $chr(15) (IP: $+ $chr(2) $+ %ip $+ $chr(15) $+ ) pertenece al ISP: $chr(2) $+ %isp $+ $chr(15) Con ASN: $chr(2) $+ %asn $+ $chr(15)
  9686. 9686 var %match = 0
  9687. 9687 var %matchchans = $null
  9688. 9688 var %i = 1
  9689. 9689
  9690. 9690 while (%i <= $numtok(%chans,44)) {
  9691. 9691 var %c = $_barna_chan_name_clean($gettok(%chans,%i,44))
  9692. 9692
  9693. 9693 if (%c != $null) {
  9694. 9694 if ($_barna_asn_in_chan(%c,%asn)) {
  9695. 9695 var %match = 1
  9696. 9696 if (%matchchans == $null) var %matchchans = %c
  9697. 9697 else if (!$istok(%matchchans,%c,44)) var %matchchans = $addtok(%matchchans,%c,44)
  9698. 9698 }
  9699. 9699
  9700. 9700 ; Build 27: este aviso informativo se muestra en todos los canales activos
  9701. 9701 ; donde este el nick. La sancion sigue usando solo %matchchans.
  9702. 9702 _barna_channel_echo_asn %c %nick %ip %asn %mensaje
  9703. 9703 }
  9704. 9704
  9705. 9705 inc %i
  9706. 9706 }
  9707. 9707
  9708. 9708 if (%match == 0) {
  9709. 9709 var %forcechans = $_barna_asn_match_chans_for_nick(%nick,%asn,%chans)
  9710. 9710 if (%forcechans != $null) {
  9711. 9711 var %match = 1
  9712. 9712 var %matchchans = %forcechans
  9713. 9713 _barna_dbg ASN MATCHFIX cache: nick= %nick ip= %ip asn= %asn chans= %matchchans
  9714. 9714 }
  9715. 9715 }
  9716. 9716
  9717. 9717 if (%match == 1) {
  9718. 9718 _barna_apply_asn_punish %nick %ip %asn %matchchans %mensaje
  9719. 9719 }
  9720. 9720
  9721. 9721 return 1
  9722. 9722}
  9723. 9723
  9724. 9724; ------------------------------------------------------------
  9725. 9725; BLOQUE 9.3
  9726. 9726; COLA ASN WEB
  9727. 9727; ------------------------------------------------------------
  9728. 9728
  9729. 9729
  9730. 9730; Build 96:
  9731. 9731; Si una consulta ASN queda pendiente pero la IP ya tiene cache ASN/ISP,
  9732. 9732; aplicamos cache inmediatamente, emitimos aviso/sancion normal y borramos
  9733. 9733; la cola fantasma. Evita estados tipo esperando_ASN con running=0 sockets=0.
  9734. 9734alias _barna_q_fastcache_apply {
  9735. 9735 if ($1 == $null) return 0
  9736. 9736
  9737. 9737 var %id = $1
  9738. 9738 var %reason = $2-
  9739. 9739 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  9740. 9740 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  9741. 9741
  9742. 9742 if (%nick == $null) return 0
  9743. 9743 if (%ip == $null) return 0
  9744. 9744 if (!$_barna_is_ipv4(%ip)) return 0
  9745. 9745
  9746. 9746 var %ln = $lower(%nick)
  9747. 9747 var %key = $_barna_asn_cache_key(%ip)
  9748. 9748
  9749. 9749 if (!$_barna_asn_cache_key_valid(%key)) return 0
  9750. 9750
  9751. 9751 var %chans = [ [ $+(%,barna_q_chans.,%id) ] ]
  9752. 9752 if (%chans == $null) var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  9753. 9753 if (%chans == $null) var %chans = $_barna_nick_enabled_chans(%nick)
  9754. 9754 if (%chans == $null) return 0
  9755. 9755
  9756. 9756 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  9757. 9757 _barna_dbg QFASTCACHE aplica cache y elimina cola ASN fantasma: id= %id nick= %nick ip= %ip chans= %chans reason= %reason
  9758. 9758
  9759. 9759 _barna_q_remove %id
  9760. 9760
  9761. 9761 unset %barna_lookup. $+ %ln
  9762. 9762 unset %barna_lookup_chans. $+ %ln
  9763. 9763 unset %barna_qry. $+ %ln
  9764. 9764 unset %barna_ipdone. $+ %ln
  9765. 9765 unset %barna_userip_sent_recent. $+ %ln
  9766. 9766 unset %barna_userip_retry. $+ %ln
  9767. 9767 unset %barna_userip_sent_ts. $+ %ln
  9768. 9768 unset %barna_userip_watchtry. $+ %ln
  9769. 9769
  9770. 9770 _barna_userip_q_release %nick QFASTCACHE
  9771. 9771 _barna_q_schedule 1
  9772. 9772 return 1
  9773. 9773 }
  9774. 9774
  9775. 9775 return 0
  9776. 9776}
  9777. 9777
  9778. 9778alias _barna_q_add {
  9779. 9779 _barna_runtime_defaults
  9780. 9780 if ($1 == $null) return
  9781. 9781 if ($2 == $null) return
  9782. 9782
  9783. 9783 var %nick = $1
  9784. 9784 var %ip = $2
  9785. 9785 var %chans = $3-
  9786. 9786 var %ln = $lower(%nick)
  9787. 9787
  9788. 9788 if ($_barna_is_join_exception(%nick)) {
  9789. 9789 _barna_dbg EXCEPTIONSAFE no encola ASN normal: nick= %nick ip= %ip
  9790. 9790 _barna_exception_cleanup_nick %nick
  9791. 9791 return
  9792. 9792 }
  9793. 9793
  9794. 9794 if ($_barna_is_privileged_nick(%nick)) {
  9795. 9795 _barna_dbg PRIVSAFE no encola ASN normal por @/+v: nick= %nick ip= %ip
  9796. 9796 _barna_privileged_cleanup_nick %nick QUEUE_ADD
  9797. 9797 return
  9798. 9798 }
  9799. 9799
  9800. 9800 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  9801. 9801 if (%chans == $null) var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  9802. 9802 if (%chans == $null) {
  9803. 9803 _barna_dbg QUEUE no add sin canales: nick= %nick ip= %ip
  9804. 9804 return
  9805. 9805 }
  9806. 9806
  9807. 9807 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  9808. 9808 _barna_dbg QUEUE usa cache ASN: nick= %nick ip= %ip chans= %chans
  9809. 9809 unset %barna_lookup. $+ %ln
  9810. 9810 unset %barna_lookup_chans. $+ %ln
  9811. 9811 unset %barna_qry. $+ %ln
  9812. 9812 unset %barna_ipdone. $+ %ln
  9813. 9813 _barna_userip_q_release %nick QUEUE_CACHE_HIT
  9814. 9814 return
  9815. 9815 }
  9816. 9816
  9817. 9817 var %ida = [ [ $+(%,barna_q_active.,%ln) ] ]
  9818. 9818
  9819. 9819 if (%ida != $null) {
  9820. 9820 set -u90 %barna_q_chans. $+ %ida %chans
  9821. 9821 _barna_dbg QUEUE dup activo, actualizo canales: id= %ida nick= %nick ip= %ip chans= %chans
  9822. 9822 return
  9823. 9823 }
  9824. 9824
  9825. 9825 var %existing = [ [ $+(%,barna_q_pending.,%ln) ] ]
  9826. 9826
  9827. 9827 if (%existing != $null) {
  9828. 9828 set -u120 %barna_q_ip. $+ %existing %ip
  9829. 9829 set -u120 %barna_q_chans. $+ %existing %chans
  9830. 9830 set -u120 %barna_q_ts. $+ %existing $ctime
  9831. 9831
  9832. 9832 if ([ [ $+(%,barna_q_low.,%existing) ] ] == 1) {
  9833. 9833 if (%barna_q_low_items != $null) {
  9834. 9834 var %newlow = $remtok(%barna_q_low_items,%existing,1,44)
  9835. 9835 if (%newlow == $null) unset %barna_q_low_items
  9836. 9836 else set %barna_q_low_items %newlow
  9837. 9837 }
  9838. 9838
  9839. 9839 unset %barna_q_low. $+ %existing
  9840. 9840
  9841. 9841 if (%barna_q_items == $null) set %barna_q_items %existing
  9842. 9842 else if (!$istok(%barna_q_items,%existing,44)) set %barna_q_items $addtok(%barna_q_items,%existing,44)
  9843. 9843
  9844. 9844 _barna_dbg QUEUE dup pendiente actualizado y promovido a normal: id= %existing nick= %nick ip= %ip chans= %chans
  9845. 9845 }
  9846. 9846 else {
  9847. 9847 _barna_dbg QUEUE dup pendiente actualizado: id= %existing nick= %nick ip= %ip chans= %chans
  9848. 9848 }
  9849. 9849
  9850. 9850 _barna_q_schedule 1
  9851. 9851 return
  9852. 9852 }
  9853. 9853
  9854. 9854 var %id = $ticks $+ $rand(100,999)
  9855. 9855
  9856. 9856 set -u90 %barna_q_nick. $+ %id %nick
  9857. 9857 set -u90 %barna_q_ip. $+ %id %ip
  9858. 9858 set -u90 %barna_q_chans. $+ %id %chans
  9859. 9859 set -u90 %barna_q_try. $+ %id 0
  9860. 9860 set -u90 %barna_q_ts. $+ %id $ctime
  9861. 9861 set -u90 %barna_q_pending. $+ %ln %id
  9862. 9862
  9863. 9863 if (%barna_q_items == $null) {
  9864. 9864 set %barna_q_items %id
  9865. 9865 }
  9866. 9866 else {
  9867. 9867 if (!$istok(%barna_q_items,%id,44)) set %barna_q_items $addtok(%barna_q_items,%id,44)
  9868. 9868 }
  9869. 9869
  9870. 9870 _barna_dbg QUEUE add: id= %id nick= %nick ip= %ip chans= %chans total= $numtok(%barna_q_items,44)
  9871. 9871
  9872. 9872 _barna_core_start
  9873. 9873 _barna_q_schedule 1
  9874. 9874}
  9875. 9875
  9876. 9876
  9877. 9877alias _barna_q_add_low {
  9878. 9878 if ($1 == $null) return
  9879. 9879 if ($2 == $null) return
  9880. 9880
  9881. 9881 var %nick = $1
  9882. 9882 var %ip = $2
  9883. 9883 var %chans = $3-
  9884. 9884 var %ln = $lower(%nick)
  9885. 9885 var %delay = %barna_q_low_delay
  9886. 9886
  9887. 9887 if ($_barna_is_join_exception(%nick)) {
  9888. 9888 _barna_dbg EXCEPTIONSAFE no encola ASN baja: nick= %nick ip= %ip
  9889. 9889 _barna_exception_cleanup_nick %nick
  9890. 9890 return
  9891. 9891 }
  9892. 9892
  9893. 9893 if ($_barna_is_privileged_nick(%nick)) {
  9894. 9894 _barna_dbg PRIVSAFE no encola ASN baja por @/+v: nick= %nick ip= %ip
  9895. 9895 _barna_privileged_cleanup_nick %nick QUEUE_ADD_LOW
  9896. 9896 return
  9897. 9897 }
  9898. 9898
  9899. 9899 if (%delay !isnum 0-) var %delay = 20
  9900. 9900
  9901. 9901 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  9902. 9902 if (%chans == $null) var %chans = [ [ $+(%,barna_lookup_chans.,%ln) ] ]
  9903. 9903 if (%chans == $null) {
  9904. 9904 _barna_dbg QUEUE baja no add sin canales: nick= %nick ip= %ip
  9905. 9905 return
  9906. 9906 }
  9907. 9907
  9908. 9908 if ($_barna_asn_cache_apply(%nick,%ip,%chans)) {
  9909. 9909 _barna_dbg QUEUE baja usa cache ASN: nick= %nick ip= %ip chans= %chans
  9910. 9910 unset %barna_lookup. $+ %ln
  9911. 9911 unset %barna_lookup_chans. $+ %ln
  9912. 9912 unset %barna_qry. $+ %ln
  9913. 9913 unset %barna_ipdone. $+ %ln
  9914. 9914 _barna_userip_q_release %nick QUEUE_LOW_CACHE_HIT
  9915. 9915 return
  9916. 9916 }
  9917. 9917
  9918. 9918 var %ida = [ [ $+(%,barna_q_active.,%ln) ] ]
  9919. 9919
  9920. 9920 if (%ida != $null) {
  9921. 9921 set -u90 %barna_q_chans. $+ %ida %chans
  9922. 9922 _barna_dbg QUEUE baja dup activo, actualizo canales: id= %ida nick= %nick ip= %ip chans= %chans
  9923. 9923 return
  9924. 9924 }
  9925. 9925
  9926. 9926 var %existing = [ [ $+(%,barna_q_pending.,%ln) ] ]
  9927. 9927
  9928. 9928 if (%existing != $null) {
  9929. 9929 set -u120 %barna_q_ip. $+ %existing %ip
  9930. 9930 set -u120 %barna_q_chans. $+ %existing %chans
  9931. 9931 set -u120 %barna_q_ts. $+ %existing $ctime
  9932. 9932
  9933. 9933 if ((%barna_q_items == $null) && (%delay > 0)) {
  9934. 9934 _barna_dbg QUEUE baja dup pendiente actualizado: id= %existing nick= %nick ip= %ip chans= %chans delay= %delay
  9935. 9935 _barna_q_schedule %delay
  9936. 9936 }
  9937. 9937 else {
  9938. 9938 _barna_dbg QUEUE baja dup pendiente actualizado: id= %existing nick= %nick ip= %ip chans= %chans
  9939. 9939 _barna_q_schedule 1
  9940. 9940 }
  9941. 9941 return
  9942. 9942 }
  9943. 9943
  9944. 9944 var %id = $ticks $+ $rand(100,999)
  9945. 9945
  9946. 9946 set -u90 %barna_q_nick. $+ %id %nick
  9947. 9947 set -u90 %barna_q_ip. $+ %id %ip
  9948. 9948 set -u90 %barna_q_chans. $+ %id %chans
  9949. 9949 set -u90 %barna_q_try. $+ %id 0
  9950. 9950 set -u90 %barna_q_ts. $+ %id $ctime
  9951. 9951 set -u90 %barna_q_pending. $+ %ln %id
  9952. 9952 set -u300 %barna_q_low. $+ %id 1
  9953. 9953
  9954. 9954 if (%barna_q_low_items == $null) {
  9955. 9955 set %barna_q_low_items %id
  9956. 9956 }
  9957. 9957 else {
  9958. 9958 if (!$istok(%barna_q_low_items,%id,44)) set %barna_q_low_items $addtok(%barna_q_low_items,%id,44)
  9959. 9959 }
  9960. 9960
  9961. 9961 _barna_dbg QUEUE baja add: id= %id nick= %nick ip= %ip chans= %chans low_total= $numtok(%barna_q_low_items,44) normal_total= $numtok(%barna_q_items,44)
  9962. 9962
  9963. 9963 if ((%barna_q_items == $null) && (%delay > 0)) {
  9964. 9964 _barna_q_schedule %delay
  9965. 9965 }
  9966. 9966 else {
  9967. 9967 _barna_q_schedule 1
  9968. 9968 }
  9969. 9969}
  9970. 9970
  9971. 9971
  9972. 9972; ------------------------------------------------------------
  9973. 9973; BLOQUE 9.3.0
  9974. 9974; SANIDAD DE COLA ASN
  9975. 9975; Evita que la cola ASN quede con IDs fantasma o motor armado sin socket
  9976. 9976; ------------------------------------------------------------
  9977. 9977
  9978. 9978alias _barna_ipinfo_sock_count {
  9979. 9979 var %i = 1
  9980. 9980 var %c = 0
  9981. 9981 while (%i <= $sock(0)) {
  9982. 9982 var %s = $sock(%i)
  9983. 9983 if (ipinfo* iswm %s) inc %c
  9984. 9984 inc %i
  9985. 9985 }
  9986. 9986 return %c
  9987. 9987}
  9988. 9988
  9989. 9989alias _barna_q_sanity {
  9990. 9990 ; Sanidad ligera: solo elimina IDs invalidos de las listas.
  9991. 9991 ; MUY IMPORTANTE: no toca running/active/pump para no romper sockopen en curso.
  9992. 9992 var %new = $null
  9993. 9993 var %i = 1
  9994. 9994
  9995. 9995 while (%i <= $numtok(%barna_q_items,44)) {
  9996. 9996 var %id = $gettok(%barna_q_items,%i,44)
  9997. 9997 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  9998. 9998 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  9999. 9999
  10000. 10000 if ((%id != $null) && (%nick != $null) && (%ip != $null)) {
  10001. 10001 if (%new == $null) var %new = %id
  10002. 10002 else if (!$istok(%new,%id,44)) var %new = $addtok(%new,%id,44)
  10003. 10003 }
  10004. 10004 else {
  10005. 10005 unset %barna_q_nick. $+ %id
  10006. 10006 unset %barna_q_ip. $+ %id
  10007. 10007 unset %barna_q_chans. $+ %id
  10008. 10008 unset %barna_q_try. $+ %id
  10009. 10009 unset %barna_q_ts. $+ %id
  10010. 10010 unset %barna_q_low. $+ %id
  10011. 10011 unset %barna_q_deferred. $+ %id
  10012. 10012 unset %barna_q_retry_timer. $+ %id
  10013. 10013 unset %barna_q_totimer. $+ %id
  10014. 10014 }
  10015. 10015
  10016. 10016 inc %i
  10017. 10017 }
  10018. 10018
  10019. 10019 if (%new == $null) unset %barna_q_items
  10020. 10020 else set %barna_q_items %new
  10021. 10021
  10022. 10022 var %newlow = $null
  10023. 10023 var %j = 1
  10024. 10024
  10025. 10025 while (%j <= $numtok(%barna_q_low_items,44)) {
  10026. 10026 var %id2 = $gettok(%barna_q_low_items,%j,44)
  10027. 10027 var %nick2 = [ [ $+(%,barna_q_nick.,%id2) ] ]
  10028. 10028 var %ip2 = [ [ $+(%,barna_q_ip.,%id2) ] ]
  10029. 10029
  10030. 10030 if ((%id2 != $null) && (%nick2 != $null) && (%ip2 != $null)) {
  10031. 10031 if (%newlow == $null) var %newlow = %id2
  10032. 10032 else if (!$istok(%newlow,%id2,44)) var %newlow = $addtok(%newlow,%id2,44)
  10033. 10033 }
  10034. 10034 else {
  10035. 10035 unset %barna_q_nick. $+ %id2
  10036. 10036 unset %barna_q_ip. $+ %id2
  10037. 10037 unset %barna_q_chans. $+ %id2
  10038. 10038 unset %barna_q_try. $+ %id2
  10039. 10039 unset %barna_q_ts. $+ %id2
  10040. 10040 unset %barna_q_low. $+ %id2
  10041. 10041 unset %barna_q_deferred. $+ %id2
  10042. 10042 unset %barna_q_retry_timer. $+ %id2
  10043. 10043 unset %barna_q_totimer. $+ %id2
  10044. 10044 }
  10045. 10045
  10046. 10046 inc %j
  10047. 10047 }
  10048. 10048
  10049. 10049 if (%newlow == $null) unset %barna_q_low_items
  10050. 10050 else set %barna_q_low_items %newlow
  10051. 10051}
  10052. 10052
  10053. 10053
  10054. 10054
  10055. 10055alias _barna_sockto_clear_ghost_timers {
  10056. 10056 var %i = $timer(0)
  10057. 10057 var %n = 0
  10058. 10058
  10059. 10059 while (%i > 0) {
  10060. 10060 var %t = $timer(%i)
  10061. 10061
  10062. 10062 if (barnasockto_* iswm $lower(%t)) {
  10063. 10063 .timer $+ %t off
  10064. 10064 inc %n
  10065. 10065 _barna_dbg GHOSTFIX apaga timer socket huerfano: timer= %t
  10066. 10066 }
  10067. 10067
  10068. 10068 dec %i
  10069. 10069 }
  10070. 10070
  10071. 10071 return %n
  10072. 10072}
  10073. 10073
  10074. 10074
  10075. 10075alias _barna_q_clear_ghost_light {
  10076. 10076 ; VARHYGIENE23 LIGHTGHOST:
  10077. 10077 ; Limpieza conservadora del estado running fantasma.
  10078. 10078 ; No recorre listas grandes, no reencola, no compacta y no arranca sockets.
  10079. 10079 ; Solo se activa si running > 0 y no hay ningun socket ipinfo visible.
  10080. 10080 var %running = %barna_q_running
  10081. 10081 if (%running == $null) var %running = 0
  10082. 10082 if (%running <= 0) return 0
  10083. 10083
  10084. 10084 var %socks = $_barna_ipinfo_sock_count
  10085. 10085 if (%socks > 0) return 0
  10086. 10086
  10087. 10087 var %id = %barna_q_last_start_id
  10088. 10088
  10089. 10089 if (%id != $null) {
  10090. 10090 var %tot = [ [ $+(%,barna_q_totimer.,%id) ] ]
  10091. 10091 if (%tot != $null) .timer $+ %tot off
  10092. 10092
  10093. 10093 var %tn = BarnaSockTO_ $+ %id
  10094. 10094 .timer $+ %tn off
  10095. 10095
  10096. 10096 unset %barna_q_totimer. $+ %id
  10097. 10097 unset %barna_sock_expected. $+ %id
  10098. 10098 unset %barna_sock_opened. $+ %id
  10099. 10099 unset %barna_sock_name. $+ %id
  10100. 10100 unset %barna_sock_nick. $+ %id
  10101. 10101 unset %barna_sock_ip. $+ %id
  10102. 10102 unset %barna_sock_id. $+ %id
  10103. 10103 }
  10104. 10104
  10105. 10105 unset %barna_q_running
  10106. 10106 unset %barna_q_active.*
  10107. 10107 unset %barna_q_process_busy
  10108. 10108 unset %barna_q_last_start_ts
  10109. 10109 unset %barna_q_last_start_id
  10110. 10110 unset %barna_q_last_start_sock
  10111. 10111
  10112. 10112 _barna_dbg GHOSTFIX_LIGHT limpio running fantasma: id= %id sockets= %socks
  10113. 10113 return 1
  10114. 10114}
  10115. 10115
  10116. 10116alias barna.ghostfix {
  10117. 10117 _barna_q_clear_ghost_light
  10118. 10118 echo -s [ASN] GHOSTFIX light ejecutado. running= $iif(%barna_q_running != $null,%barna_q_running,0) sockets= $_barna_ipinfo_sock_count
  10119. 10119}
  10120. 10120
  10121. 10121
  10122. 10122alias _barna_sockto_orphan_gc {
  10123. 10123 ; VARHYGIENE24:
  10124. 10124 ; Limpia timers BarnaSockTO_* que quedaron vivos cuando ya no hay socket real
  10125. 10125 ; ni running ASN. No toca sockets activos ni reencola nada.
  10126. 10126 var %running = %barna_q_running
  10127. 10127 if (%running == $null) var %running = 0
  10128. 10128 if (%running > 0) return 0
  10129. 10129 if ($_barna_ipinfo_sock_count > 0) return 0
  10130. 10130
  10131. 10131 var %deleted = 0
  10132. 10132 var %i = $timer(0)
  10133. 10133 while (%i > 0) {
  10134. 10134 var %t = $timer(%i)
  10135. 10135 if ($left($lower(%t),12) == barnasockto_) {
  10136. 10136 .timer $+ %t off
  10137. 10137 inc %deleted
  10138. 10138 }
  10139. 10139 dec %i
  10140. 10140 }
  10141. 10141
  10142. 10142 if (%deleted > 0) _barna_dbg SOCKTOGC timers huerfanos apagados: %deleted
  10143. 10143 return %deleted
  10144. 10144}
  10145. 10145
  10146. 10146alias barna.socktogc {
  10147. 10147 var %n = $_barna_sockto_orphan_gc
  10148. 10148 echo -s [ASN] SOCKTOGC ejecutado. apagados= %n running= $iif(%barna_q_running != $null,%barna_q_running,0) sockets= $_barna_ipinfo_sock_count
  10149. 10149}
  10150. 10150
  10151. 10151
  10152. 10152
  10153. 10153
  10154. 10154alias _barna_sock_state_purge_id {
  10155. 10155 if ($1 == $null) return 0
  10156. 10156
  10157. 10157 var %id = $1
  10158. 10158 var %nick = [ [ $+(%,barna_sock_nick.,%id) ] ]
  10159. 10159 var %ln = $lower(%nick)
  10160. 10160
  10161. 10161 unset %barna_sock_nick. $+ %id
  10162. 10162 unset %barna_sock_ip. $+ %id
  10163. 10163 unset %barna_sock_id. $+ %id
  10164. 10164 unset %barna_sock_name. $+ %id
  10165. 10165 unset %barna_sock_expected. $+ %id
  10166. 10166 unset %barna_sock_opened. $+ %id
  10167. 10167
  10168. 10168 if (%ln != $null) {
  10169. 10169 unset %barna_sock. $+ %ln
  10170. 10170 unset %barna_rx. $+ %ln
  10171. 10171 unset %barna_asn_done. $+ %ln
  10172. 10172 unset %barna_sock_timeout_seen. $+ %ln
  10173. 10173 unset %barna_q_finished. $+ %ln
  10174. 10174 unset %temp_ip_ $+ %nick
  10175. 10175 unset %asn_val. $+ %nick
  10176. 10176 unset %as_name_val. $+ %nick
  10177. 10177 }
  10178. 10178
  10179. 10179 return 1
  10180. 10180}
  10181. 10181
  10182. 10182alias _barna_sock_state_purge_sock {
  10183. 10183 if ($1 == $null) return 0
  10184. 10184
  10185. 10185 var %sock = $1
  10186. 10186 var %id = $_barna_sock_to_id(%sock)
  10187. 10187 var %nick = $_barna_sock_to_nick(%sock)
  10188. 10188
  10189. 10189 if (%id != $null) noop $_barna_sock_state_purge_id(%id)
  10190. 10190
  10191. 10191 if (%nick != $null) {
  10192. 10192 var %ln = $lower(%nick)
  10193. 10193 unset %barna_sock. $+ %ln
  10194. 10194 unset %barna_rx. $+ %ln
  10195. 10195 unset %barna_asn_done. $+ %ln
  10196. 10196 unset %barna_sock_timeout_seen. $+ %ln
  10197. 10197 unset %barna_q_finished. $+ %ln
  10198. 10198 unset %temp_ip_ $+ %nick
  10199. 10199 unset %asn_val. $+ %nick
  10200. 10200 unset %as_name_val. $+ %nick
  10201. 10201 }
  10202. 10202
  10203. 10203 return 1
  10204. 10204}
  10205. 10205
  10206. 10206alias _barna_userip_idle_gc {
  10207. 10207 ; Build 100: solo normaliza inflight si la cola WHOIP esta realmente vacia.
  10208. 10208 ; Si hay cola, purgar inflight mata RAW354 pendientes y deja sin debug.
  10209. 10209 if ($_barna_userip_q_count > 0) return 0
  10210. 10210 if (($var(%barna_userip_inflight.*,0) > 1) || (($var(%barna_userip_inflight.*,0) > 0) && (%barna_whoip_current_ln == $null))) noop $_barna_statecap_hardgc
  10211. 10211
  10212. 10212 var %infcount = %barna_userip_inflight_count
  10213. 10213 if (%infcount !isnum 1-) var %infcount = 0
  10214. 10214 if (%infcount > 0) return 0
  10215. 10215 if ($var(%barna_userip_inflight.*,0) > 0) return 0
  10216. 10216
  10217. 10217 unset %barna_userip_q_item.*
  10218. 10218 unset %barna_userip_q_chans.*
  10219. 10219 unset %barna_userip_q_pending.*
  10220. 10220 unset %barna_userip_q_nick.*
  10221. 10221 unset %barna_userip_q_slot.*
  10222. 10222 unset %barna_userip_q_head
  10223. 10223 unset %barna_userip_q_tail
  10224. 10224 unset %barna_userip_q_count_real
  10225. 10225 unset %barna_userip_q_scheduled
  10226. 10226 unset %barna_userip_q_processing
  10227. 10227 unset %barna_userip_q_active
  10228. 10228 unset %barna_userip_q_running
  10229. 10229
  10230. 10230 ; Build 98: si WHOIP esta idle, no conservar estado de envio/lookup.
  10231. 10231 unset %barna_userip_sent_recent.*
  10232. 10232 unset %barna_userip_sent_ts.*
  10233. 10233 unset %barna_userip_retry.*
  10234. 10234 unset %barna_userip_watchtry.*
  10235. 10235 unset %barna_userip_current_*
  10236. 10236 unset %barna_whoip_current_*
  10237. 10237 unset %barna_userip_inflight.*
  10238. 10238 unset %barna_userip_inflight_count
  10239. 10239
  10240. 10240 if ((%barna_q_items == $null) && (%barna_q_low_items == $null) && (%barna_q_running == 0) && ($_barna_ipinfo_sock_count == 0)) {
  10241. 10241 unset %barna_lookup.*
  10242. 10242 unset %barna_lookup_chans.*
  10243. 10243 unset %barna_qry.*
  10244. 10244 unset %barna_ipdone.*
  10245. 10245 unset %barna_last_ip.*
  10246. 10246 unset %barna_last_ip_ts.*
  10247. 10247 unset %barna_q_finished.*
  10248. 10248 noop $_barna_sockvar_gc
  10249. 10249 }
  10250. 10250
  10251. 10251 return 1
  10252. 10252}
  10253. 10253
  10254. 10254alias _barna_sockvar_count {
  10255. 10255 return $calc($var(%barna_sock.*,0) + $var(%barna_sock_name.*,0) + $var(%barna_sock_nick.*,0) + $var(%barna_sock_ip.*,0) + $var(%barna_sock_id.*,0) + $var(%barna_sock_expected.*,0) + $var(%barna_sock_opened.*,0) + $var(%barna_rx.*,0) + $var(%barna_asn_done.*,0))
  10256. 10256}
  10257. 10257
  10258. 10258alias _barna_sockvar_gc_tick {
  10259. 10259 ; VARHYGIENE47:
  10260. 10260 ; GC periodico y ligero de restos sock/rx/asn_done.
  10261. 10261 ; No toca canales ni ASN. Solo actua si no hay sockets reales ni ASN running.
  10262. 10262 if (%barna_addon != 1) return 0
  10263. 10263 if (%barna_sockvar_gc_busy == 1) return 0
  10264. 10264
  10265. 10265 var %now = $ctime
  10266. 10266 var %secs = %barna_sockvar_gc_secs
  10267. 10267 if (%secs !isnum 5-) var %secs = 10
  10268. 10268
  10269. 10269 if (%barna_sockvar_gc_last != $null) {
  10270. 10270 if ($calc(%now - %barna_sockvar_gc_last) < %secs) return 0
  10271. 10271 }
  10272. 10272
  10273. 10273 set -u10 %barna_sockvar_gc_busy 1
  10274. 10274 set %barna_sockvar_gc_last %now
  10275. 10275
  10276. 10276 var %max = %barna_sockvar_max_vars
  10277. 10277 if (%max !isnum 10-) var %max = 25
  10278. 10278
  10279. 10279 var %vars = $_barna_sockvar_count
  10280. 10280 if (%vars > %max) {
  10281. 10281 var %n = $_barna_sockvar_gc
  10282. 10282 if (%n > 0) _barna_dbg SOCKVARGC auto limpio restos sock/rx/asn_done: %n
  10283. 10283 }
  10284. 10284
  10285. 10285 unset %barna_sockvar_gc_busy
  10286. 10286 return 0
  10287. 10287}
  10288. 10288
  10289. 10289alias _barna_sockvar_gc {
  10290. 10290 ; VARHYGIENE47:
  10291. 10291 ; Limpia restos de sockets/ASN antiguos. Si hay running fantasma sin sockets,
  10292. 10292 ; primero aplica LIGHTGHOST y despues limpia. No toca canales ni ASN configurados.
  10293. 10293 var %running = %barna_q_running
  10294. 10294 if (%running == $null) var %running = 0
  10295. 10295
  10296. 10296 if ((%running > 0) && ($_barna_ipinfo_sock_count == 0)) {
  10297. 10297 noop $_barna_q_clear_ghost_light
  10298. 10298 var %running = %barna_q_running
  10299. 10299 if (%running == $null) var %running = 0
  10300. 10300 }
  10301. 10301
  10302. 10302 if (%running > 0) return 0
  10303. 10303 if ($_barna_ipinfo_sock_count > 0) return 0
  10304. 10304
  10305. 10305 var %before = $_barna_sockvar_count
  10306. 10306 if (%before <= 0) return 0
  10307. 10307
  10308. 10308 unset %barna_sock.*
  10309. 10309 unset %barna_sock_name.*
  10310. 10310 unset %barna_sock_nick.*
  10311. 10311 unset %barna_sock_ip.*
  10312. 10312 unset %barna_sock_id.*
  10313. 10313 unset %barna_sock_expected.*
  10314. 10314 unset %barna_sock_opened.*
  10315. 10315 unset %barna_rx.*
  10316. 10316 unset %barna_asn_done.*
  10317. 10317
  10318. 10318 return %before
  10319. 10319}
  10320. 10320
  10321. 10321alias barna.sockvarclean {
  10322. 10322 var %n = $_barna_sockvar_gc
  10323. 10323 echo -s [ASN] SOCKVARCLEAN ejecutado. limpiadas= %n running= $iif(%barna_q_running != $null,%barna_q_running,0) sockets= $_barna_ipinfo_sock_count sin tocar canales/ASN.
  10324. 10324}
  10325. 10325
  10326. 10326alias _barna_q_clear_ghost_running {
  10327. 10327 ; VARHYGIENE20 GHOSTFIX3:
  10328. 10328 ; Si se invoca con parametro now, no espera gracia: running>0 con sockets=0
  10329. 10329 ; se limpia inmediatamente. Esto evita que /barna.qstatus muestre fantasma
  10330. 10330 ; y que BarnaASNPump quede bloqueado esperando un timeout sin socket real.
  10331. 10331 var %force = $1
  10332. 10332
  10333. 10333 ; VARHYGIENE11 FAILFAST:
  10334. 10334 ; Si hay running pero no existe socket ipinfo visible tras una gracia corta,
  10335. 10335 ; se considera intento fallido de sockopen. No se reencola indefinidamente:
  10336. 10336 ; se descarta el/los ID activos para evitar bucles y lag acumulativo.
  10337. 10337 var %running = %barna_q_running
  10338. 10338 if (%running == $null) var %running = 0
  10339. 10339 if (%running <= 0) return 0
  10340. 10340
  10341. 10341 var %socks = $_barna_ipinfo_sock_count
  10342. 10342 if (%socks > 0) return 0
  10343. 10343
  10344. 10344 var %last = %barna_q_last_start_ts
  10345. 10345 var %grace = %barna_q_ghost_grace_secs
  10346. 10346 if (%grace !isnum 0-) var %grace = 0
  10347. 10347 if (%force == now) var %grace = 0
  10348. 10348
  10349. 10349 if (%last != $null) {
  10350. 10350 if ((%grace > 0) && ($calc($ctime - %last) < %grace)) return 0
  10351. 10351 }
  10352. 10352
  10353. 10353 var %discarded = 0
  10354. 10354
  10355. 10355 ; El ID mas reciente queda registrado aqui.
  10356. 10356 var %id = %barna_q_last_start_id
  10357. 10357 if (%id != $null) {
  10358. 10358 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10359. 10359 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  10360. 10360 _barna_dbg QUEUE running fantasma FAILFAST descarta lastid: id= %id nick= %nick ip= %ip
  10361. 10361 _barna_q_remove %id
  10362. 10362 inc %discarded
  10363. 10363 }
  10364. 10364
  10365. 10365 ; Si quedaron otros activos de workers anteriores, descartar tambien.
  10366. 10366 while ($var(%barna_q_active.*,0) > 0) {
  10367. 10367 var %v = $var(%barna_q_active.*,1)
  10368. 10368 var %aid = $(%v,2)
  10369. 10369 if (%aid != $null) {
  10370. 10370 if (%aid != %id) {
  10371. 10371 var %anick = [ [ $+(%,barna_q_nick.,%aid) ] ]
  10372. 10372 var %aip = [ [ $+(%,barna_q_ip.,%aid) ] ]
  10373. 10373 _barna_dbg QUEUE running fantasma FAILFAST descarta active: id= %aid nick= %anick ip= %aip
  10374. 10374 _barna_q_remove %aid
  10375. 10375 inc %discarded
  10376. 10376 }
  10377. 10377 }
  10378. 10378 unset %barna_q_active.*
  10379. 10379 }
  10380. 10380
  10381. 10381 var %lastsock = %barna_q_last_start_sock
  10382. 10382 if (%lastsock != $null) {
  10383. 10383 if ($sock(%lastsock)) sockclose %lastsock
  10384. 10384 }
  10385. 10385
  10386. 10386 var %s = $sock(0)
  10387. 10387 while (%s > 0) {
  10388. 10388 var %sn = $sock(%s)
  10389. 10389 if (ipinfo* iswm %sn) sockclose %sn
  10390. 10390 dec %s
  10391. 10391 }
  10392. 10392
  10393. 10393 noop $_barna_sockto_clear_ghost_timers
  10394. 10394
  10395. 10395 unset %barna_q_running
  10396. 10396 unset %barna_q_active.*
  10397. 10397 unset %barna_q_process_busy
  10398. 10398 unset %barna_q_last_start_ts
  10399. 10399 unset %barna_q_last_start_id
  10400. 10400 unset %barna_q_last_start_sock
  10401. 10401 unset %barna_sock_expected.*
  10402. 10402 unset %barna_sock_opened.*
  10403. 10403 unset %barna_sock_name.*
  10404. 10404
  10405. 10405 _barna_dbg QUEUE running fantasma FAILFAST limpio: descartados= %discarded sockets= %socks
  10406. 10406 _barna_asn_pump_start_if_needed
  10407. 10407 return 1
  10408. 10408}
  10409. 10409
  10410. 10410alias _barna_asn_total_queue {
  10411. 10411 var %n = $numtok(%barna_q_items,44)
  10412. 10412 var %l = $numtok(%barna_q_low_items,44)
  10413. 10413 if (%n == $null) var %n = 0
  10414. 10414 if (%l == $null) var %l = 0
  10415. 10415 return $calc(%n + %l)
  10416. 10416}
  10417. 10417
  10418. 10418alias _barna_asn_workers_now {
  10419. 10419 ; VARHYGIENE11 FAILFAST:
  10420. 10420 ; Volvemos a 1 worker real. El bloqueo visto no era falta de workers,
  10421. 10421 ; sino running fantasma cuando sockopen no quedaba vivo. Con 1 worker
  10422. 10422 ; evitamos perder varios IDs activos y simplificamos la limpieza.
  10423. 10423 return 1
  10424. 10424}
  10425. 10425
  10426. 10426alias _barna_q_force_start {
  10427. 10427 if (%barna_addon != 1) return
  10428. 10428
  10429. 10429 _barna_q_sanity
  10430. 10430
  10431. 10431 var %qr = %barna_q_running
  10432. 10432 if (%qr == $null) var %qr = 0
  10433. 10433
  10434. 10434 ; Ultra-safe: no fuerces si hay una consulta viva. Espera a sockread/sockclose/timeout.
  10435. 10435 if (%qr > 0) {
  10436. 10436 _barna_asn_pump_start_if_needed
  10437. 10437 return
  10438. 10438 }
  10439. 10439
  10440. 10440 if ((%barna_q_items != $null) || (%barna_q_low_items != $null)) {
  10441. 10441 _barna_q_process
  10442. 10442 }
  10443. 10443
  10444. 10444 _barna_asn_pump_start_if_needed
  10445. 10445}
  10446. 10446
  10447. 10447alias _barna_asn_pump_start_if_needed {
  10448. 10448 if (%barna_addon != 1) return
  10449. 10449
  10450. 10450 var %running = %barna_q_running
  10451. 10451 if (%running == $null) var %running = 0
  10452. 10452
  10453. 10453 var %delay = %barna_asn_pump_delay
  10454. 10454 if (%delay !isnum 1-) var %delay = 2
  10455. 10455 if (%delay < 2) var %delay = 2
  10456. 10456
  10457. 10457 ; VARHYGIENE18:
  10458. 10458 ; BarnaASNPump queda como timer permanente ligero.
  10459. 10459 ; Antes se apagaba en idle y al reiniciar mIRC podia no volver a nacer.
  10460. 10460 if ($timer(BarnaASNPump) == $null) {
  10461. 10461 set -u300 %barna_asn_pump_running 1
  10462. 10462 set -u300 %barna_asn_pump_armed 1
  10463. 10463 .timerBarnaASNPump 0 %delay _barna_asn_pump_tick
  10464. 10464 }
  10465. 10465
  10466. 10466 if (%running == 0) {
  10467. 10467 if (($_barna_asn_queue_has_items == 1) && ($_barna_ipinfo_sock_count == 0)) {
  10468. 10468 noop $_barna_asn_direct_start_one
  10469. 10469 }
  10470. 10470 }
  10471. 10471}
  10472. 10472
  10473. 10473alias _barna_asn_pump_stop_if_idle {
  10474. 10474 if (%barna_addon != 1) {
  10475. 10475 .timerBarnaASNPump off
  10476. 10476 unset %barna_asn_pump_running
  10477. 10477 unset %barna_asn_pump_armed
  10478. 10478 return
  10479. 10479 }
  10480. 10480
  10481. 10481 ; VARHYGIENE18:
  10482. 10482 ; No apagamos BarnaASNPump en idle. El coste es minimo y evita que el addon
  10483. 10483 ; quede sin bomba ASN tras reinicios, resets parciales o estados fantasma.
  10484. 10484 _barna_asn_pump_start_if_needed
  10485. 10485}
  10486. 10486
  10487. 10487alias _barna_asn_pump_tick {
  10488. 10488 if (%barna_addon != 1) {
  10489. 10489 .timerBarnaASNPump off
  10490. 10490 unset %barna_asn_pump_running
  10491. 10491 unset %barna_asn_pump_armed
  10492. 10492 return
  10493. 10493 }
  10494. 10494
  10495. 10495 _barna_q_clear_ghost_light
  10496. 10496
  10497. 10497 var %running = %barna_q_running
  10498. 10498 if (%running == $null) var %running = 0
  10499. 10499
  10500. 10500 ; Si hay consulta ASN viva, no procesar ni tocar estados. El heartbeat sigue vivo.
  10501. 10501 if (%running > 0) {
  10502. 10502 _barna_asn_pump_stop_if_idle
  10503. 10503 return
  10504. 10504 }
  10505. 10505
  10506. 10506 _barna_q_sanity
  10507. 10507
  10508. 10508 if ((%barna_q_items == $null) && (%barna_q_low_items == $null)) {
  10509. 10509 _barna_asn_pump_stop_if_idle
  10510. 10510 return
  10511. 10511 }
  10512. 10512
  10513. 10513 ; Procesa como maximo hasta workers actuales; si hay cola alta permite 2.
  10514. 10514 ; VARHYGIENE5: si q_process queda bloqueado por estado viejo, hacemos
  10515. 10515 ; un arranque directo de un solo ID para evitar cola ASN dormida.
  10516. 10516 unset %barna_q_process_busy
  10517. 10517 _barna_q_process
  10518. 10518
  10519. 10519 var %running2 = %barna_q_running
  10520. 10520 if (%running2 == $null) var %running2 = 0
  10521. 10521
  10522. 10522 if ((%running2 == 0) && ($_barna_asn_queue_has_items == 1)) {
  10523. 10523 _barna_asn_direct_start_one
  10524. 10524 }
  10525. 10525
  10526. 10526 _barna_asn_pump_stop_if_idle
  10527. 10527}
  10528. 10528
  10529. 10529alias _barna_q_schedule {
  10530. 10530 _barna_core_start
  10531. 10531
  10532. 10532 ; Motor ASN unificado: evitamos mantener BarnaASNQ y BarnaASNPump a la vez.
  10533. 10533 ; La bomba BarnaASNPump es el unico timer de la cola ASN.
  10534. 10534 _barna_asn_pump_start_if_needed
  10535. 10535}
  10536. 10536
  10537. 10537alias _barna_q_fire {
  10538. 10538 ; Compatibilidad con timers antiguos que pudieran quedar vivos tras cargar versiones previas.
  10539. 10539 unset %barna_q_scheduled
  10540. 10540 unset %barna_q_prune_last
  10541. 10541 _barna_q_process
  10542. 10542 _barna_asn_pump_start_if_needed
  10543. 10543}
  10544. 10544
  10545. 10545alias _barna_q_stop_timeout {
  10546. 10546 if ($1 == $null) return
  10547. 10547
  10548. 10548 var %id = $1
  10549. 10549 var %t = [ [ $+(%,barna_q_totimer.,%id) ] ]
  10550. 10550
  10551. 10551 if (%t != $null) {
  10552. 10552 .timer $+ %t off
  10553. 10553 }
  10554. 10554
  10555. 10555 unset %barna_q_totimer. $+ %id
  10556. 10556}
  10557. 10557
  10558. 10558alias _barna_q_remove {
  10559. 10559 if ($1 == $null) return
  10560. 10560
  10561. 10561 var %id = $1
  10562. 10562 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10563. 10563 var %ln = $lower(%nick)
  10564. 10564 var %rt = [ [ $+(%,barna_q_retry_timer.,%id) ] ]
  10565. 10565
  10566. 10566 _barna_q_stop_timeout %id
  10567. 10567 noop $_barna_sock_state_purge_id(%id)
  10568. 10568
  10569. 10569 if (%rt != $null) {
  10570. 10570 .timer $+ %rt off
  10571. 10571 }
  10572. 10572
  10573. 10573 unset %barna_q_deferred. $+ %id
  10574. 10574 unset %barna_q_retry_timer. $+ %id
  10575. 10575
  10576. 10576 if (%barna_q_items != $null) {
  10577. 10577 var %newitems = $remtok(%barna_q_items,%id,1,44)
  10578. 10578
  10579. 10579 if (%newitems == $null) unset %barna_q_items
  10580. 10580 else set %barna_q_items %newitems
  10581. 10581 }
  10582. 10582
  10583. 10583 if (%barna_q_low_items != $null) {
  10584. 10584 var %newlowitems = $remtok(%barna_q_low_items,%id,1,44)
  10585. 10585
  10586. 10586 if (%newlowitems == $null) unset %barna_q_low_items
  10587. 10587 else set %barna_q_low_items %newlowitems
  10588. 10588 }
  10589. 10589
  10590. 10590 unset %barna_q_low. $+ %id
  10591. 10591
  10592. 10592 if (%nick != $null) {
  10593. 10593 unset %barna_q_active. $+ %ln
  10594. 10594 unset %barna_q_pending. $+ %ln
  10595. 10595 unset %barna_q_finished. $+ %ln
  10596. 10596 }
  10597. 10597
  10598. 10598 ; Limpieza de socket seguro por ID.
  10599. 10599 var %sockid = ipinfo $+ %id
  10600. 10600 if ($sock(%sockid)) sockclose %sockid
  10601. 10601 var %sockid_old = ipinfo_ $+ %id
  10602. 10602 if ($sock(%sockid_old)) sockclose %sockid_old
  10603. 10603 unset %barna_sock_nick. $+ %id
  10604. 10604 unset %barna_sock_ip. $+ %id
  10605. 10605 unset %barna_sock_id. $+ %id
  10606. 10606 unset %barna_sock_name. $+ %id
  10607. 10607 unset %barna_sock_expected. $+ %id
  10608. 10608 unset %barna_sock_opened. $+ %id
  10609. 10609
  10610. 10610 unset %barna_q_nick. $+ %id
  10611. 10611 unset %barna_q_ip. $+ %id
  10612. 10612 unset %barna_q_chans. $+ %id
  10613. 10613 unset %barna_q_try. $+ %id
  10614. 10614 unset %barna_q_ts. $+ %id
  10615. 10615 noop $_barna_q_idle_gc
  10616. 10616 _barna_asn_pump_stop_if_idle
  10617. 10617}
  10618. 10618
  10619. 10619
  10620. 10620alias _barna_q_remove_for_nick {
  10621. 10621 if ($1 == $null) return 0
  10622. 10622
  10623. 10623 var %nick = $1
  10624. 10624 var %reason = $2-
  10625. 10625 var %ln = $lower(%nick)
  10626. 10626 var %removed = 0
  10627. 10627 var %id = [ [ $+(%,barna_q_active.,%ln) ] ]
  10628. 10628
  10629. 10629 if (%id != $null) {
  10630. 10630 _barna_dbg QUEUE remove por nick protegido activo: id= %id nick= %nick reason= %reason
  10631. 10631 _barna_q_remove %id
  10632. 10632 inc %removed
  10633. 10633 }
  10634. 10634
  10635. 10635 var %pid = [ [ $+(%,barna_q_pending.,%ln) ] ]
  10636. 10636 if (%pid != $null) {
  10637. 10637 _barna_dbg QUEUE remove por nick protegido pendiente: id= %pid nick= %nick reason= %reason
  10638. 10638 _barna_q_remove %pid
  10639. 10639 inc %removed
  10640. 10640 }
  10641. 10641
  10642. 10642 var %i = 1
  10643. 10643 while (%i <= $numtok(%barna_q_items,44)) {
  10644. 10644 var %qid = $gettok(%barna_q_items,%i,44)
  10645. 10645 var %qn = [ [ $+(%,barna_q_nick.,%qid) ] ]
  10646. 10646
  10647. 10647 if ($lower(%qn) == %ln) {
  10648. 10648 _barna_dbg QUEUE remove por nick protegido en lista normal: id= %qid nick= %nick reason= %reason
  10649. 10649 _barna_q_remove %qid
  10650. 10650 inc %removed
  10651. 10651 continue
  10652. 10652 }
  10653. 10653
  10654. 10654 inc %i
  10655. 10655 }
  10656. 10656
  10657. 10657 var %j = 1
  10658. 10658 while (%j <= $numtok(%barna_q_low_items,44)) {
  10659. 10659 var %qid2 = $gettok(%barna_q_low_items,%j,44)
  10660. 10660 var %qn2 = [ [ $+(%,barna_q_nick.,%qid2) ] ]
  10661. 10661
  10662. 10662 if ($lower(%qn2) == %ln) {
  10663. 10663 _barna_dbg QUEUE remove por nick protegido en lista baja: id= %qid2 nick= %nick reason= %reason
  10664. 10664 _barna_q_remove %qid2
  10665. 10665 inc %removed
  10666. 10666 continue
  10667. 10667 }
  10668. 10668
  10669. 10669 inc %j
  10670. 10670 }
  10671. 10671
  10672. 10672 return %removed
  10673. 10673}
  10674. 10674
  10675. 10675alias _barna_q_prune {
  10676. 10676 if (%barna_q_items == $null) return
  10677. 10677
  10678. 10678 var %i = 1
  10679. 10679 var %now = $ctime
  10680. 10680 var %stale = %barna_q_stale_secs
  10681. 10681
  10682. 10682 if (%stale !isnum 60-) var %stale = 300
  10683. 10683
  10684. 10684 while (%i <= $numtok(%barna_q_items,44)) {
  10685. 10685 var %id = $gettok(%barna_q_items,%i,44)
  10686. 10686 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10687. 10687 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  10688. 10688 var %ts = [ [ $+(%,barna_q_ts.,%id) ] ]
  10689. 10689
  10690. 10690 if (%nick == $null) || (%ip == $null) {
  10691. 10691 _barna_dbg QUEUE prune invalido: id= %id
  10692. 10692 _barna_q_remove %id
  10693. 10693 continue
  10694. 10694 }
  10695. 10695
  10696. 10696 if (%ts != $null) {
  10697. 10697 if ($calc(%now - %ts) > %stale) {
  10698. 10698 _barna_dbg QUEUE prune viejo: id= %id nick= %nick ip= %ip edad= $calc(%now - %ts)
  10699. 10699 _barna_q_remove %id
  10700. 10700 continue
  10701. 10701 }
  10702. 10702 }
  10703. 10703
  10704. 10704 inc %i
  10705. 10705 }
  10706. 10706}
  10707. 10707
  10708. 10708alias _barna_q_prune_low {
  10709. 10709 if (%barna_q_low_items == $null) return
  10710. 10710
  10711. 10711 var %i = 1
  10712. 10712 var %now = $ctime
  10713. 10713 var %stale = %barna_q_stale_secs
  10714. 10714
  10715. 10715 if (%stale !isnum 60-) var %stale = 300
  10716. 10716
  10717. 10717 while (%i <= $numtok(%barna_q_low_items,44)) {
  10718. 10718 var %id = $gettok(%barna_q_low_items,%i,44)
  10719. 10719 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10720. 10720 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  10721. 10721 var %ts = [ [ $+(%,barna_q_ts.,%id) ] ]
  10722. 10722
  10723. 10723 if (%nick == $null) || (%ip == $null) {
  10724. 10724 _barna_dbg QUEUE baja prune invalido: id= %id
  10725. 10725 _barna_q_remove %id
  10726. 10726 continue
  10727. 10727 }
  10728. 10728
  10729. 10729 if (%ts != $null) {
  10730. 10730 if ($calc(%now - %ts) > %stale) {
  10731. 10731 _barna_dbg QUEUE baja prune viejo: id= %id nick= %nick ip= %ip edad= $calc(%now - %ts)
  10732. 10732 _barna_q_remove %id
  10733. 10733 continue
  10734. 10734 }
  10735. 10735 }
  10736. 10736
  10737. 10737 inc %i
  10738. 10738 }
  10739. 10739}
  10740. 10740
  10741. 10741alias _barna_q_running_inc {
  10742. 10742 var %r = %barna_q_running
  10743. 10743 if (%r == $null) var %r = 0
  10744. 10744 inc %r
  10745. 10745 set -u300 %barna_q_running %r
  10746. 10746}
  10747. 10747
  10748. 10748alias _barna_q_running_dec {
  10749. 10749 var %r = %barna_q_running
  10750. 10750 if (%r == $null) var %r = 0
  10751. 10751 dec %r
  10752. 10752
  10753. 10753 if (%r < 0) var %r = 0
  10754. 10754
  10755. 10755 if (%r == 0) unset %barna_q_running
  10756. 10756 else set -u300 %barna_q_running %r
  10757. 10757}
  10758. 10758
  10759. 10759; ------------------------------------------------------------
  10760. 10760; BLOQUE 9.3.1
  10761. 10761; REINTENTO DIFERIDO CON BACKOFF
  10762. 10762; ------------------------------------------------------------
  10763. 10763
  10764. 10764alias _barna_q_retry_delay {
  10765. 10765 if ($1 == $null) return 30
  10766. 10766
  10767. 10767 var %try = $1
  10768. 10768 var %base = %barna_q_retry_base_secs
  10769. 10769 var %maxb = %barna_q_retry_max_backoff
  10770. 10770 var %delay
  10771. 10771
  10772. 10772 if (%base !isnum 5-) var %base = 30
  10773. 10773 if (%maxb !isnum 30-) var %maxb = 240
  10774. 10774 if (%maxb < %base) var %maxb = %base
  10775. 10775
  10776. 10776 if (%try <= 1) var %delay = %base
  10777. 10777 elseif (%try == 2) var %delay = $calc(%base * 2)
  10778. 10778 elseif (%try == 3) var %delay = $calc(%base * 4)
  10779. 10779 else var %delay = $calc(%base * 8)
  10780. 10780
  10781. 10781 if (%delay > %maxb) var %delay = %maxb
  10782. 10782
  10783. 10783 return %delay
  10784. 10784}
  10785. 10785
  10786. 10786alias _barna_q_retry_schedule {
  10787. 10787 if ($1 == $null) return
  10788. 10788
  10789. 10789 var %id = $1
  10790. 10790 var %reason = $2-
  10791. 10791 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10792. 10792 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  10793. 10793 var %try = [ [ $+(%,barna_q_try.,%id) ] ]
  10794. 10794
  10795. 10795 if (%nick == $null) || (%ip == $null) {
  10796. 10796 _barna_q_remove %id
  10797. 10797 return
  10798. 10798 }
  10799. 10799
  10800. 10800 if (%try == $null) var %try = 1
  10801. 10801
  10802. 10802 var %ln = $lower(%nick)
  10803. 10803 var %delay = $_barna_q_retry_delay(%try)
  10804. 10804 var %tn = BarnaQRetry_ $+ %id
  10805. 10805
  10806. 10806 var %oldt = [ [ $+(%,barna_q_retry_timer.,%id) ] ]
  10807. 10807 if (%oldt != $null) {
  10808. 10808 .timer $+ %oldt off
  10809. 10809 }
  10810. 10810
  10811. 10811 set -u120 %barna_q_deferred. $+ %id 1
  10812. 10812 set -u120 %barna_q_retry_timer. $+ %id %tn
  10813. 10813 set -u90 %barna_q_pending. $+ %ln %id
  10814. 10814
  10815. 10815 _barna_dbg QUEUE retry diferido: id= %id nick= %nick ip= %ip try= %try delay= %delay reason= %reason
  10816. 10816
  10817. 10817 .timer $+ %tn 1 %delay _barna_q_requeue_now %id
  10818. 10818}
  10819. 10819
  10820. 10820alias _barna_q_requeue_now {
  10821. 10821 if ($1 == $null) return
  10822. 10822
  10823. 10823 var %id = $1
  10824. 10824 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10825. 10825 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  10826. 10826
  10827. 10827 unset %barna_q_deferred. $+ %id
  10828. 10828 unset %barna_q_retry_timer. $+ %id
  10829. 10829
  10830. 10830 if (%nick == $null) || (%ip == $null) {
  10831. 10831 _barna_q_remove %id
  10832. 10832 _barna_q_schedule 1
  10833. 10833 return
  10834. 10834 }
  10835. 10835
  10836. 10836 var %ln = $lower(%nick)
  10837. 10837
  10838. 10838 if ([ [ $+(%,barna_q_active.,%ln) ] ] != $null) {
  10839. 10839 _barna_q_retry_schedule %id ACTIVE_STILL_PRESENT
  10840. 10840 return
  10841. 10841 }
  10842. 10842
  10843. 10843 if ([ [ $+(%,barna_q_low.,%id) ] ] == 1) {
  10844. 10844 if (%barna_q_low_items == $null) {
  10845. 10845 set %barna_q_low_items %id
  10846. 10846 }
  10847. 10847 else {
  10848. 10848 if (!$istok(%barna_q_low_items,%id,44)) {
  10849. 10849 set %barna_q_low_items $addtok(%barna_q_low_items,%id,44)
  10850. 10850 }
  10851. 10851 }
  10852. 10852 }
  10853. 10853 else {
  10854. 10854 if (%barna_q_items == $null) {
  10855. 10855 set %barna_q_items %id
  10856. 10856 }
  10857. 10857 else {
  10858. 10858 if (!$istok(%barna_q_items,%id,44)) {
  10859. 10859 set %barna_q_items $addtok(%barna_q_items,%id,44)
  10860. 10860 }
  10861. 10861 }
  10862. 10862 }
  10863. 10863
  10864. 10864 set -u90 %barna_q_pending. $+ %ln %id
  10865. 10865 set -u90 %barna_q_ts. $+ %id $ctime
  10866. 10866
  10867. 10867 if ([ [ $+(%,barna_q_low.,%id) ] ] == 1) {
  10868. 10868 _barna_dbg QUEUE baja reencolado diferido: id= %id nick= %nick ip= %ip low_total= $numtok(%barna_q_low_items,44)
  10869. 10869 }
  10870. 10870 else {
  10871. 10871 _barna_dbg QUEUE reencolado diferido: id= %id nick= %nick ip= %ip total= $numtok(%barna_q_items,44)
  10872. 10872 }
  10873. 10873
  10874. 10874 _barna_q_schedule 1
  10875. 10875}
  10876. 10876
  10877. 10877alias _barna_q_process {
  10878. 10878 ; Motor ASN balanced ASNFAST:
  10879. 10879 ; 1 worker normal; 2 workers desde cola ASN >= umbral.
  10880. 10880 ; Usa el contador real de sockets para evitar quedar parado con running fantasma.
  10881. 10881 if (%barna_q_process_busy == 1) return
  10882. 10882 set -u10 %barna_q_process_busy 1
  10883. 10883
  10884. 10884 _barna_q_sanity
  10885. 10885 _barna_q_clear_ghost_light
  10886. 10886
  10887. 10887 var %running = %barna_q_running
  10888. 10888 if (%running == $null) var %running = 0
  10889. 10889
  10890. 10890 var %socks_now = $_barna_ipinfo_sock_count
  10891. 10891 var %last_start = %barna_q_last_start_ts
  10892. 10892 var %grace = %barna_q_start_grace_secs
  10893. 10893 if (%grace !isnum 0-) var %grace = 0
  10894. 10894
  10895. 10895 ; Si no hay sockets reales, limpiar running fantasma de forma conservadora.
  10896. 10896 if ((%running > 0) && (%socks_now == 0)) {
  10897. 10897 _barna_q_clear_ghost_light
  10898. 10898 var %running = %barna_q_running
  10899. 10899 if (%running == $null) var %running = 0
  10900. 10900 }
  10901. 10901
  10902. 10902 var %workers = $_barna_asn_workers_now
  10903. 10903
  10904. 10904 while ((%running < %workers) && ((%barna_q_items != $null) || (%barna_q_low_items != $null))) {
  10905. 10905 var %lowmode = 0
  10906. 10906
  10907. 10907 if (%barna_q_items != $null) {
  10908. 10908 var %id = $gettok(%barna_q_items,1,44)
  10909. 10909 var %newitems = $remtok(%barna_q_items,%id,1,44)
  10910. 10910
  10911. 10911 if (%newitems == $null) unset %barna_q_items
  10912. 10912 else set %barna_q_items %newitems
  10913. 10913 }
  10914. 10914 else {
  10915. 10915 var %id = $gettok(%barna_q_low_items,1,44)
  10916. 10916 var %newlowitems = $remtok(%barna_q_low_items,%id,1,44)
  10917. 10917 var %lowmode = 1
  10918. 10918
  10919. 10919 if (%newlowitems == $null) unset %barna_q_low_items
  10920. 10920 else set %barna_q_low_items %newlowitems
  10921. 10921 }
  10922. 10922
  10923. 10923 if (%id == $null) break
  10924. 10924
  10925. 10925 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10926. 10926 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  10927. 10927
  10928. 10928 if (%nick == $null) || (%ip == $null) {
  10929. 10929 _barna_q_remove %id
  10930. 10930 var %running = %barna_q_running
  10931. 10931 if (%running == $null) var %running = 0
  10932. 10932 continue
  10933. 10933 }
  10934. 10934
  10935. 10935 ; Build 96: si mientras esperaba cola ya entro cache ASN para esta IP,
  10936. 10936 ; aplicar cache ahora y no abrir socket ipinfo innecesario.
  10937. 10937 if ($_barna_q_fastcache_apply(%id,Q_PROCESS)) {
  10938. 10938 var %running = %barna_q_running
  10939. 10939 if (%running == $null) var %running = 0
  10940. 10940 continue
  10941. 10941 }
  10942. 10942
  10943. 10943 unset %barna_q_pending. $+ $lower(%nick)
  10944. 10944 set -u300 %barna_q_active. $+ $lower(%nick) %id
  10945. 10945
  10946. 10946 if (%lowmode == 1) {
  10947. 10947 _barna_dbg QUEUE baja toma turno ultra-safe turbo: id= %id nick= %nick ip= %ip workers= %workers normal_total= $numtok(%barna_q_items,44) low_total= $numtok(%barna_q_low_items,44)
  10948. 10948 }
  10949. 10949 else {
  10950. 10950 _barna_dbg QUEUE toma turno ultra-safe turbo: id= %id nick= %nick ip= %ip workers= %workers normal_total= $numtok(%barna_q_items,44) low_total= $numtok(%barna_q_low_items,44)
  10951. 10951 }
  10952. 10952
  10953. 10953 _barna_q_start %id
  10954. 10954
  10955. 10955 var %running = %barna_q_running
  10956. 10956 if (%running == $null) var %running = 0
  10957. 10957 }
  10958. 10958
  10959. 10959 unset %barna_q_process_busy
  10960. 10960 _barna_asn_pump_start_if_needed
  10961. 10961}
  10962. 10962alias _barna_q_start {
  10963. 10963 if ($1 == $null) return
  10964. 10964
  10965. 10965 var %id = $1
  10966. 10966 var %nick = [ [ $+(%,barna_q_nick.,%id) ] ]
  10967. 10967 var %ip = [ [ $+(%,barna_q_ip.,%id) ] ]
  10968. 10968
  10969. 10969 if (%nick == $null) || (%ip == $null) {
  10970. 10970 _barna_q_remove %id
  10971. 10971 return
  10972. 10972 }
  10973. 10973
  10974. 10974 var %try = [ [ $+(%,barna_q_try.,%id) ] ]
  10975. 10975 if (%try == $null) var %try = 0
  10976. 10976 inc %try
  10977. 10977
  10978. 10978 set -u180 %barna_q_try. $+ %id %try
  10979. 10979 set -u300 %barna_q_active. $+ $lower(%nick) %id
  10980. 10980 unset %barna_q_finished. $+ $lower(%nick)
  10981. 10981
  10982. 10982 set -u90 %temp_ip_ $+ %nick %ip
  10983. 10983 unset %asn_val. $+ %nick
  10984. 10984 unset %as_name_val. $+ %nick
  10985. 10985 unset %barna_asn_done. $+ $lower(%nick)
  10986. 10986 unset %barna_sock_timeout_seen. $+ $lower(%nick)
  10987. 10987 set -u90 %barna_rx. $+ $lower(%nick) 0
  10988. 10988
  10989. 10989 ; VARHYGIENE9: socket por ID de cola con nombre simple ipinfo<ID>, no por nick.
  10990. 10990 ; Esto evita caracteres problemáticos y colisiones cuando el nick cambia o se repite.
  10991. 10991 var %sock_name = $_barna_sock_name(%nick,%id)
  10992. 10992
  10993. 10993 ; Si quedó un socket viejo con el mismo ID, lo cerramos antes de abrir.
  10994. 10994 if ($sock(%sock_name)) sockclose %sock_name
  10995. 10995
  10996. 10996 set -u20 %barna_sock_nick. $+ %id %nick
  10997. 10997 set -u20 %barna_sock_ip. $+ %id %ip
  10998. 10998 set -u20 %barna_sock_id. $+ %id %id
  10999. 10999 set -u20 %barna_sock_expected. $+ %id %sock_name
  11000. 11000 unset %barna_sock_opened. $+ %id
  11001. 11001
  11002. 11002 _barna_q_running_inc
  11003. 11003 set -u60 %barna_q_last_start_ts $ctime
  11004. 11004 set -u60 %barna_q_last_start_id %id
  11005. 11005 set -u60 %barna_q_last_start_sock %sock_name
  11006. 11006
  11007. 11007 if ([ [ $+(%,barna_q_low.,%id) ] ] == 1) {
  11008. 11008 _barna_dbg QUEUE baja consulta: id= %id try= %try nick= %nick ip= %ip sock= %sock_name running= %barna_q_running
  11009. 11009 }
  11010. 11010 else {
  11011. 11011 _barna_dbg QUEUE consulta: id= %id try= %try nick= %nick ip= %ip sock= %sock_name running= %barna_q_running
  11012. 11012 }
  11013. 11013
  11014. 11014 sockopen -e %sock_name api.ipinfo.io 443
  11015. 11015
  11016. 11016 ; VARHYGIENE19: si sockopen no deja socket visible, cerrar el intento
  11017. 11017 ; inmediatamente para no quedar running=1 con sockets=0.
  11018. 11018 if (!$sock(%sock_name)) {
  11019. 11019 _barna_dbg QUEUE sockopen sin socket visible: id= %id nick= %nick ip= %ip sock= %sock_name
  11020. 11020 _barna_q_retry_or_done %nick SOCKOPEN_NO_SOCKET
  11021. 11021 return
  11022. 11022 }
  11023. 11023
  11024. 11024 var %sockto = %barna_sock_timeout_secs
  11025. 11025 if (%sockto !isnum 10-) var %sockto = 30
  11026. 11026
  11027. 11027 var %totimer = BarnaSockTO_ $+ %id
  11028. 11028 set -u300 %barna_q_totimer. $+ %id %totimer
  11029. 11029
  11030. 11030 .timer $+ %totimer 1 %sockto _barna_sock_timeout %nick %sock_name %id
  11031. 11031}
  11032. 11032
  11033. 11033alias _barna_q_done {
  11034. 11034 if ($1 == $null) return
  11035. 11035
  11036. 11036 var %nick = $1
  11037. 11037 var %ln = $lower(%nick)
  11038. 11038 var %id = [ [ $+(%,barna_q_active.,%ln) ] ]
  11039. 11039
  11040. 11040 _barna_q_running_dec
  11041. 11041
  11042. 11042 if (%id != $null) {
  11043. 11043 _barna_dbg QUEUE done: id= %id nick= %nick motivo= $2-
  11044. 11044 _barna_q_remove %id
  11045. 11045 }
  11046. 11046
  11047. 11047 _barna_lookup_timer_off %nick
  11048. 11048
  11049. 11049 unset %barna_lookup. $+ %ln
  11050. 11050 unset %barna_lookup_chans. $+ %ln
  11051. 11051 unset %barna_qry. $+ %ln
  11052. 11052
  11053. 11053 var %delay = %barna_q_delay
  11054. 11054 if (%delay !isnum 0-) var %delay = 3
  11055. 11055
  11056. 11056 _barna_q_schedule %delay
  11057. 11057}
  11058. 11058
  11059. 11059alias _barna_q_retry_or_done {
  11060. 11060 if ($1 == $null) return
  11061. 11061
  11062. 11062 var %nick = $1
  11063. 11063 var %ln = $lower(%nick)
  11064. 11064 var %reason = $2-
  11065. 11065 var %id = [ [ $+(%,barna_q_active.,%ln) ] ]
  11066. 11066
  11067. 11067 if (%id == $null) {
  11068. 11068 _barna_cleanup_done %nick
  11069. 11069 _barna_q_schedule 1
  11070. 11070 return
  11071. 11071 }
  11072. 11072
  11073. 11073 var %try = [ [ $+(%,barna_q_try.,%id) ] ]
  11074. 11074 if (%try == $null) var %try = 0
  11075. 11075
  11076. 11076 var %max = %barna_q_max_retries
  11077. 11077 if (%max !isnum 0-) var %max = 4
  11078. 11078
  11079. 11079 _barna_q_stop_timeout %id
  11080. 11080
  11081. 11081 unset %barna_q_active. $+ %ln
  11082. 11082 unset %barna_q_finished. $+ %ln
  11083. 11083
  11084. 11084 _barna_q_running_dec
  11085. 11085 _barna_cleanup_done %nick
  11086. 11086
  11087. 11087 if (%try <= %max) {
  11088. 11088 _barna_q_retry_schedule %id %reason
  11089. 11089 _barna_q_schedule 1
  11090. 11090 return
  11091. 11091 }
  11092. 11092
  11093. 11093 _barna_dbg QUEUE fallo final: id= %id nick= %nick try= %try max= %max reason= %reason
  11094. 11094
  11095. 11095 _barna_q_remove %id
  11096. 11096
  11097. 11097 _barna_lookup_timer_off %nick
  11098. 11098
  11099. 11099 unset %barna_lookup. $+ %ln
  11100. 11100 unset %barna_lookup_chans. $+ %ln
  11101. 11101 unset %barna_qry. $+ %ln
  11102. 11102
  11103. 11103 var %delay2 = %barna_q_delay
  11104. 11104 if (%delay2 !isnum 0-) var %delay2 = 3
  11105. 11105
  11106. 11106 _barna_q_schedule %delay2
  11107. 11107}
  11108. 11108
  11109. 11109; ------------------------------------------------------------
  11110. 11110; BLOQUE 10
  11111. 11111; SOCKET AUTOMATICO
  11112. 11112; ------------------------------------------------------------
  11113. 11113
  11114. 11114on *:sockopen:ipinfo*:{
  11115. 11115 if (%barna_addon != 1) {
  11116. 11116 sockclose $sockname
  11117. 11117 return
  11118. 11118 }
  11119. 11119
  11120. 11120 var %nick_id = $_barna_sock_to_nick($sockname)
  11121. 11121 var %ln = $lower(%nick_id)
  11122. 11122
  11123. 11123 if (%nick_id == $null) {
  11124. 11124 sockclose $sockname
  11125. 11125 return
  11126. 11126 }
  11127. 11127
  11128. 11128 if ($sockerr) {
  11129. 11129 _barna_dbg SOCKOPEN ERROR: sock= $sockname nick= %nick_id err= $sockerr
  11130. 11130 sockclose $sockname
  11131. 11131 _barna_q_retry_or_done %nick_id SOCKOPEN_ERROR
  11132. 11132 return
  11133. 11133 }
  11134. 11134
  11135. 11135 set -u20 %barna_sock. $+ %ln $sockname
  11136. 11136
  11137. 11137 var %qid = $_barna_sock_to_id($sockname)
  11138. 11138 if (%qid != $null) {
  11139. 11139 set -u20 %barna_sock_name. $+ %qid $sockname
  11140. 11140 set -u20 %barna_sock_opened. $+ %qid 1
  11141. 11141 }
  11142. 11142 var %ip_val
  11143. 11143
  11144. 11144 if (%qid != $null) var %ip_val = [ [ $+(%,barna_sock_ip.,%qid) ] ]
  11145. 11145 if (%ip_val == $null) var %ip_val = [ [ $+(%,temp_ip_,%nick_id) ] ]
  11146. 11146
  11147. 11147 if (%ip_val == $null) {
  11148. 11148 _barna_dbg SOCKOPEN ERROR sin IP: sock= $sockname nick= %nick_id
  11149. 11149 sockclose $sockname
  11150. 11150 _barna_q_retry_or_done %nick_id SIN_IP
  11151. 11151 return
  11152. 11152 }
  11153. 11153
  11154. 11154 _barna_dbg SOCKOPEN HTTPS OK: sock= $sockname ssl= $sock($sockname).ssl nick= %nick_id ip= %ip_val -> GET
  11155. 11155
  11156. 11156 sockwrite -n $sockname GET /lite/ $+ %ip_val $+ ?token=ecc8eaec4dc0de HTTP/1.1
  11157. 11157 sockwrite -n $sockname Host: api.ipinfo.io
  11158. 11158 sockwrite -n $sockname Connection: close
  11159. 11159 sockwrite -n $sockname Accept: application/json
  11160. 11160 sockwrite -n $sockname Accept-Encoding: identity
  11161. 11161 sockwrite -n $sockname User-Agent: mIRC-BarnaAddon
  11162. 11162 sockwrite -n $sockname $crlf
  11163. 11163}
  11164. 11164
  11165. 11165alias _barna_sock_timeout {
  11166. 11166 if ($1 == $null) return
  11167. 11167 if ($2 == $null) return
  11168. 11168
  11169. 11169 var %nick = $1
  11170. 11170 var %sock = $2
  11171. 11171 var %id = $3
  11172. 11172 var %ln = $lower(%nick)
  11173. 11173 var %cur = [ [ $+(%,barna_sock.,%ln) ] ]
  11174. 11174
  11175. 11175 ; VARHYGIENE8: el timeout debe funcionar aunque el socket nunca haya llegado
  11176. 11176 ; a disparar sockopen. Antes, si %barna_sock.nick no existia, salia con return
  11177. 11177 ; y dejaba running fantasma para siempre.
  11178. 11178 if (%id != $null) {
  11179. 11179 var %active = [ [ $+(%,barna_q_active.,%ln) ] ]
  11180. 11180 var %expected = [ [ $+(%,barna_sock_expected.,%id) ] ]
  11181. 11181
  11182. 11182 if ((%active != %id) && (%barna_q_last_start_id != %id)) return
  11183. 11183 if ((%expected != $null) && (%expected != %sock)) return
  11184. 11184 }
  11185. 11185 else {
  11186. 11186 if ((%cur != $null) && (%cur != %sock)) return
  11187. 11187 }
  11188. 11188
  11189. 11189 set -u30 %barna_sock_timeout_seen. $+ %ln 1
  11190. 11190
  11191. 11191 ; VARHYGIENE19: si el timeout corresponde al lastid pero se perdio
  11192. 11192 ; %barna_q_active.<nick>, lo reconstruimos para que _barna_q_retry_or_done
  11193. 11193 ; pueda decrementar running y limpiar el ID.
  11194. 11194 if (%id != $null) {
  11195. 11195 var %active_now = [ [ $+(%,barna_q_active.,%ln) ] ]
  11196. 11196 if ((%active_now == $null) && (%barna_q_last_start_id == %id)) {
  11197. 11197 set -u120 %barna_q_active. $+ %ln %id
  11198. 11198 }
  11199. 11199 }
  11200. 11200
  11201. 11201 _barna_dbg TIMEOUT SOCKET: nick= %nick sock= %sock id= %id cur= %cur opened= [ [ $+(%,barna_sock_opened.,%id) ] ]
  11202. 11202
  11203. 11203 if ($sock(%sock)) sockclose %sock
  11204. 11204
  11205. 11205 if (%id != $null) {
  11206. 11206 unset %barna_sock_expected. $+ %id
  11207. 11207 unset %barna_sock_opened. $+ %id
  11208. 11208 unset %barna_sock_name. $+ %id
  11209. 11209 }
  11210. 11210
  11211. 11211 _barna_q_retry_or_done %nick TIMEOUT
  11212. 11212 noop $_barna_sock_state_purge_id(%id)
  11213. 11213}
  11214. 11214
  11215. 11215on *:sockread:ipinfo*:{
  11216. 11216 if (%barna_addon != 1) {
  11217. 11217 sockclose $sockname
  11218. 11218 return
  11219. 11219 }
  11220. 11220
  11221. 11221 var %nick_id = $_barna_sock_to_nick($sockname)
  11222. 11222 var %ln = $lower(%nick_id)
  11223. 11223 var %linea
  11224. 11224
  11225. 11225 if ([ [ $+(%,barna_asn_done.,%ln) ] ] == 1) {
  11226. 11226 _barna_dbg ASN duplicado ignorado: nick= %nick_id sock= $sockname
  11227. 11227 noop $_barna_sock_state_purge_sock($sockname)
  11228. 11228 sockclose $sockname
  11229. 11229 return
  11230. 11230 }
  11231. 11231
  11232. 11232 sockread %linea
  11233. 11233 if ($sockbrk) return
  11234. 11234
  11235. 11235 var %rx = [ [ $+(%,barna_rx.,%ln) ] ]
  11236. 11236 if (%rx == $null) var %rx = 0
  11237. 11237 var %rx = $calc(%rx + 1)
  11238. 11238 set -u10 %barna_rx. $+ %ln %rx
  11239. 11239
  11240. 11240 if ((%barna_debug == 1) && (%barna_debug_rx == 1)) {
  11241. 11241 if (%rx <= 20) {
  11242. 11242 if (%linea != $null) {
  11243. 11243 _barna_debug_window
  11244. 11244 echo @BarnaASNDebug $timestamp $chr(3) $+ 12 $+ [BARNA-RX] $chr(15) $+ $chr(32) $+ %nick_id $+ $chr(32) $+ : $chr(32) $+ %linea
  11245. 11245 }
  11246. 11246 }
  11247. 11247 }
  11248. 11248
  11249. 11249 if ($regex(%linea,/"asn"\s*:\s*"(AS\d+)"/i)) {
  11250. 11250 set -u15 %asn_val. $+ %nick_id $regml(1)
  11251. 11251 }
  11252. 11252 else {
  11253. 11253 if ($regex(%linea,/\b(AS\d+)\b/i)) {
  11254. 11254 set -u15 %asn_val. $+ %nick_id $regml(1)
  11255. 11255 }
  11256. 11256 }
  11257. 11257
  11258. 11258 if ($regex(%linea,/"as_name"\s*:\s*"([^"]+)"/i)) {
  11259. 11259 set -u15 %as_name_val. $+ %nick_id $regml(1)
  11260. 11260 }
  11261. 11261 else {
  11262. 11262 if ([ [ $+(%,as_name_val.,%nick_id) ] ] == $null) {
  11263. 11263 if ($regex(%linea,/"name"\s*:\s*"([^"]+)"/i)) {
  11264. 11264 set -u15 %as_name_val. $+ %nick_id $regml(1)
  11265. 11265 }
  11266. 11266 }
  11267. 11267 }
  11268. 11268
  11269. 11269 var %asn = [ [ $+(%,asn_val.,%nick_id) ] ]
  11270. 11270 var %isp = [ [ $+(%,as_name_val.,%nick_id) ] ]
  11271. 11271
  11272. 11272 if ((%asn != $null) && (%isp != $null)) {
  11273. 11273 if ([ [ $+(%,barna_asn_done.,%ln) ] ] == 1) {
  11274. 11274 _barna_dbg ASN duplicado ignorado: nick= %nick_id sock= $sockname
  11275. 11275 noop $_barna_sock_state_purge_sock($sockname)
  11276. 11276 sockclose $sockname
  11277. 11277 return
  11278. 11278 }
  11279. 11279
  11280. 11280 set -u8 %barna_asn_done. $+ %ln 1
  11281. 11281
  11282. 11282 var %qid = [ [ $+(%,barna_q_active.,%ln) ] ]
  11283. 11283 var %ip_val = [ [ $+(%,temp_ip_,%nick_id) ] ]
  11284. 11284 var %seen = $_barna_seen_get(%nick_id)
  11285. 11285
  11286. 11286 if (%seen == $null) {
  11287. 11287 if (%qid != $null) {
  11288. 11288 var %seen = [ [ $+(%,barna_q_chans.,%qid) ] ]
  11289. 11289 _barna_dbg ASN usando canales guardados: nick= %nick_id canales= %seen
  11290. 11290 }
  11291. 11291 }
  11292. 11292
  11293. 11293 var %allseen = $_barna_echo_chans_for_nick(%nick_id,%seen)
  11294. 11294 if (%allseen != $null) var %seen = %allseen
  11295. 11295
  11296. 11296 _barna_asn_cache_store %ip_val %asn %isp
  11297. 11297
  11298. 11298 var %dnick = $_barna_nick_display(%nick_id)
  11299. 11299 var %mensaje = El usuario $chr(2) $+ %dnick $+ $chr(15) (IP: $+ $chr(2) $+ %ip_val $+ $chr(15) $+ ) pertenece al ISP: $chr(2) $+ %isp $+ $chr(15) Con ASN: $chr(2) $+ %asn $+ $chr(15)
  11300. 11300 var %match = 0
  11301. 11301 var %matchchans = $null
  11302. 11302 var %i = 1
  11303. 11303
  11304. 11304 _barna_dbg ASN RESUELTO nick= %nick_id ip= %ip_val asn= %asn canales= %seen
  11305. 11305
  11306. 11306 while (%i <= $numtok(%seen,44)) {
  11307. 11307 var %c = $_barna_chan_name_clean($gettok(%seen,%i,44))
  11308. 11308
  11309. 11309 if (%c != $null) {
  11310. 11310 _barna_dbg ECHO canal= %c asn= %asn match= $_barna_asn_in_chan(%c,%asn)
  11311. 11311
  11312. 11312 if ($_barna_asn_in_chan(%c,%asn)) {
  11313. 11313 var %match = 1
  11314. 11314 if (%matchchans == $null) var %matchchans = %c
  11315. 11315 else if (!$istok(%matchchans,%c,44)) var %matchchans = $addtok(%matchchans,%c,44)
  11316. 11316 }
  11317. 11317
  11318. 11318 ; Build 27/89: aviso informativo con dedupe canonico por canal+nick.
  11319. 11319 ; La sancion sigue usando solo %matchchans.
  11320. 11320 _barna_channel_echo_asn %c %nick_id %ip_val %asn %mensaje
  11321. 11321 }
  11322. 11322
  11323. 11323 inc %i
  11324. 11324 }
  11325. 11325
  11326. 11326 if (%match == 0) {
  11327. 11327 var %forcechans = $_barna_asn_match_chans_for_nick(%nick_id,%asn,%seen)
  11328. 11328 if (%forcechans != $null) {
  11329. 11329 var %match = 1
  11330. 11330 var %matchchans = %forcechans
  11331. 11331 _barna_dbg ASN MATCHFIX socket: nick= %nick_id ip= %ip_val asn= %asn chans= %matchchans
  11332. 11332 }
  11333. 11333 }
  11334. 11334
  11335. 11335 if (%match == 1) {
  11336. 11336 _barna_apply_asn_punish %nick_id %ip_val %asn %matchchans %mensaje
  11337. 11337 }
  11338. 11338
  11339. 11339 set -u10 %barna_q_finished. $+ %ln 1
  11340. 11340
  11341. 11341 sockclose $sockname
  11342. 11342 _barna_cleanup_done %nick_id
  11343. 11343 _barna_q_done %nick_id OK
  11344. 11344 noop $_barna_sock_state_purge_sock($sockname)
  11345. 11345 return
  11346. 11346 }
  11347. 11347
  11348. 11348 if (%rx >= 250) {
  11349. 11349 _barna_dbg RX LIMITE: nick= %nick_id sin datos completos
  11350. 11350 sockclose $sockname
  11351. 11351 _barna_q_retry_or_done %nick_id RX_LIMITE
  11352. 11352 noop $_barna_sock_state_purge_sock($sockname)
  11353. 11353 return
  11354. 11354 }
  11355. 11355}
  11356. 11356
  11357. 11357on *:sockclose:ipinfo*:{
  11358. 11358 var %nick_id = $_barna_sock_to_nick($sockname)
  11359. 11359
  11360. 11360 if (%nick_id == $null) return
  11361. 11361
  11362. 11362 var %ln = $lower(%nick_id)
  11363. 11363
  11364. 11364 unset %barna_sock. $+ %ln
  11365. 11365
  11366. 11366 if ([ [ $+(%,barna_sock_timeout_seen.,%ln) ] ] == 1) {
  11367. 11367 unset %barna_sock_timeout_seen. $+ %ln
  11368. 11368 return
  11369. 11369 }
  11370. 11370
  11371. 11371 if ([ [ $+(%,barna_q_finished.,%ln) ] ] == 1) {
  11372. 11372 noop $_barna_sock_state_purge_sock($sockname)
  11373. 11373 return
  11374. 11374 }
  11375. 11375 if ([ [ $+(%,barna_asn_done.,%ln) ] ] == 1) {
  11376. 11376 noop $_barna_sock_state_purge_sock($sockname)
  11377. 11377 return
  11378. 11378 }
  11379. 11379
  11380. 11380 var %id = [ [ $+(%,barna_q_active.,%ln) ] ]
  11381. 11381
  11382. 11382 if (%id != $null) {
  11383. 11383 var %asn = [ [ $+(%,asn_val.,%nick_id) ] ]
  11384. 11384 var %isp = [ [ $+(%,as_name_val.,%nick_id) ] ]
  11385. 11385
  11386. 11386 if ((%asn == $null) || (%isp == $null)) {
  11387. 11387 _barna_dbg SOCKCLOSE prematuro: nick= %nick_id id= %id asn= %asn isp= %isp
  11388. 11388 _barna_q_retry_or_done %nick_id SOCKCLOSE
  11389. 11389 noop $_barna_sock_state_purge_sock($sockname)
  11390. 11390 }
  11391. 11391 }
  11392. 11392}
  11393. 11393
  11394. 11394; ------------------------------------------------------------
  11395. 11395; BLOQUE 10.4.0
  11396. 11396; AVISO INMEDIATO EN @Parseline2 AL DETECTAR POSITIVO
  11397. 11397; ------------------------------------------------------------
  11398. 11398
  11399. 11399alias _barna_parseline_cazado {
  11400. 11400 if ($1 == $null) return
  11401. 11401
  11402. 11402 var %nick = $1
  11403. 11403 var %ip = $2
  11404. 11404 var %chans = $3
  11405. 11405 var %msg = $4-
  11406. 11406 var %ln = $lower(%nick)
  11407. 11407 var %ipkey = $replace(%ip,.,_)
  11408. 11408 var %showchans = $replace(%chans,$chr(44),$+(,$chr(32)))
  11409. 11409
  11410. 11410 if (%ipkey == $null) var %ipkey = sinip
  11411. 11411
  11412. 11412 if ([ [ $+(%,barna_parseline_done.,%ln,.,%ipkey) ] ] == 1) return
  11413. 11413
  11414. 11414 set -u300 %barna_parseline_done. $+ %ln $+ . $+ %ipkey 1
  11415. 11415
  11416. 11416 if ((%showchans != $null) && (%msg != $null)) {
  11417. 11417 echo @Parseline2 $timestamp $chr(2) $+ cazado $chr(15) $+ (canal/es: $chr(2) $+ %showchans $+ $chr(15) $+ ) $+ $chr(32) $+ %msg
  11418. 11418 }
  11419. 11419 elseif (%msg != $null) {
  11420. 11420 echo @Parseline2 $timestamp $chr(2) $+ cazado $chr(15) $+ $chr(32) $+ %msg
  11421. 11421 }
  11422. 11422 else {
  11423. 11423 echo @Parseline2 $timestamp $chr(2) $+ cazado $chr(15) $+ $chr(32) $+ El usuario $chr(2) $+ %nick $+ $chr(15) IP: $chr(2) $+ %ip $+ $chr(15)
  11424. 11424 }
  11425. 11425}
  11426. 11426
  11427. 11427; ------------------------------------------------------------
  11428. 11428; BLOQUE 10.4.1
  11429. 11429; SAQUIT DIFERIDO TRAS SHUN
  11430. 11430; ------------------------------------------------------------
  11431. 11431
  11432. 11432alias _barna_timer_delayed_saquit {
  11433. 11433 return BarnaSAQUIT_ $+ $ticks $+ _ $+ $rand(100,999)
  11434. 11434}
  11435. 11435
  11436. 11436alias _barna_saquit_q_repair {
  11437. 11437 var %items = $var(%barna_saquit_q_item.*,0)
  11438. 11438
  11439. 11439 if (%items <= 0) {
  11440. 11440 if ((%barna_saquit_q_count_real != $null) || (%barna_saquit_q_head != $null) || (%barna_saquit_q_tail != $null)) {
  11441. 11441 unset %barna_saquit_q_head
  11442. 11442 unset %barna_saquit_q_tail
  11443. 11443 unset %barna_saquit_q_count_real
  11444. 11444 unset %barna_saquit_q_item.*
  11445. 11445 unset %barna_saquit_q_due.*
  11446. 11446 unset %barna_saquit_q_slot.*
  11447. 11447 .timerBarnaSAQUITPump off
  11448. 11448 _barna_dbg SAQUITQFIX cola sin items, indices limpiados
  11449. 11449 }
  11450. 11450
  11451. 11451 return 0
  11452. 11452 }
  11453. 11453
  11454. 11454 var %i = 1
  11455. 11455 var %count = 0
  11456. 11456 var %min = 0
  11457. 11457 var %max = 0
  11458. 11458
  11459. 11459 while (%i <= %items) {
  11460. 11460 var %v = $var(%barna_saquit_q_item.*,%i)
  11461. 11461 var %slot = $gettok(%v,-1,46)
  11462. 11462 var %nick = [ [ $+(%,barna_saquit_q_item.,%slot) ] ]
  11463. 11463
  11464. 11464 if ((%slot !isnum 1-) || (%nick == $null)) {
  11465. 11465 if (%slot isnum 1-) {
  11466. 11466 unset %barna_saquit_q_item. $+ %slot
  11467. 11467 unset %barna_saquit_q_due. $+ %slot
  11468. 11468 }
  11469. 11469 }
  11470. 11470 else {
  11471. 11471 inc %count
  11472. 11472
  11473. 11473 if ((%min == 0) || (%slot < %min)) var %min = %slot
  11474. 11474 if (%slot > %max) var %max = %slot
  11475. 11475
  11476. 11476 var %ln = $lower(%nick)
  11477. 11477 set -u900 %barna_saquit_q_slot. $+ %ln %slot
  11478. 11478 }
  11479. 11479
  11480. 11480 inc %i
  11481. 11481 }
  11482. 11482
  11483. 11483 if (%count <= 0) {
  11484. 11484 unset %barna_saquit_q_head
  11485. 11485 unset %barna_saquit_q_tail
  11486. 11486 unset %barna_saquit_q_count_real
  11487. 11487 unset %barna_saquit_q_item.*
  11488. 11488 unset %barna_saquit_q_due.*
  11489. 11489 unset %barna_saquit_q_slot.*
  11490. 11490 .timerBarnaSAQUITPump off
  11491. 11491 _barna_dbg SAQUITQFIX cola vacia tras reparacion
  11492. 11492 return 0
  11493. 11493 }
  11494. 11494
  11495. 11495 if ((%barna_saquit_q_head != %min) || (%barna_saquit_q_tail != %max) || (%barna_saquit_q_count_real != %count)) {
  11496. 11496 _barna_dbg SAQUITQFIX reparada: head_old= %barna_saquit_q_head tail_old= %barna_saquit_q_tail count_old= %barna_saquit_q_count_real head_new= %min tail_new= %max count_new= %count
  11497. 11497 }
  11498. 11498
  11499. 11499 set %barna_saquit_q_head %min
  11500. 11500 set %barna_saquit_q_tail %max
  11501. 11501 set %barna_saquit_q_count_real %count
  11502. 11502
  11503. 11503 return %count
  11504. 11504}
  11505. 11505
  11506. 11506alias barna.saquitfix {
  11507. 11507 echo -s [ASN] SAQUITQFIX antes: head= %barna_saquit_q_head tail= %barna_saquit_q_tail count= %barna_saquit_q_count_real vars= $var(%barna_saquit*,0)
  11508. 11508 noop $_barna_saquit_q_repair
  11509. 11509 _barna_saquit_q_start
  11510. 11510 echo -s [ASN] SAQUITQFIX despues: head= %barna_saquit_q_head tail= %barna_saquit_q_tail count= %barna_saquit_q_count_real vars= $var(%barna_saquit*,0)
  11511. 11511}
  11512. 11512
  11513. 11513alias _barna_saquit_q_count {
  11514. 11514 if (%barna_saquit_q_count_real !isnum 0-) return 0
  11515. 11515 return %barna_saquit_q_count_real
  11516. 11516}
  11517. 11517
  11518. 11518alias _barna_saquit_q_inc {
  11519. 11519 var %c = %barna_saquit_q_count_real
  11520. 11520 if (%c !isnum 0-) var %c = 0
  11521. 11521 inc %c
  11522. 11522 set %barna_saquit_q_count_real %c
  11523. 11523}
  11524. 11524
  11525. 11525alias _barna_saquit_q_dec {
  11526. 11526 var %c = %barna_saquit_q_count_real
  11527. 11527 if (%c !isnum 0-) var %c = 0
  11528. 11528 dec %c
  11529. 11529 if (%c < 0) var %c = 0
  11530. 11530 if (%c == 0) unset %barna_saquit_q_count_real
  11531. 11531 else set %barna_saquit_q_count_real %c
  11532. 11532}
  11533. 11533
  11534. 11534alias _barna_saquit_q_start {
  11535. 11535 if (%barna_addon != 1) return
  11536. 11536
  11537. 11537 noop $_barna_saquit_q_repair
  11538. 11538
  11539. 11539 if ($_barna_saquit_q_count <= 0) {
  11540. 11540 .timerBarnaSAQUITPump off
  11541. 11541 return
  11542. 11542 }
  11543. 11543
  11544. 11544 if ($timer(BarnaSAQUITPump) == $null) {
  11545. 11545 .timerBarnaSAQUITPump 1 1 _barna_saquit_q_pump
  11546. 11546 }
  11547. 11547}
  11548. 11548
  11549. 11549alias _barna_saquit_q_compact_if_empty {
  11550. 11550 if ($_barna_saquit_q_count > 0) return
  11551. 11551
  11552. 11552 unset %barna_saquit_q_head
  11553. 11553 unset %barna_saquit_q_tail
  11554. 11554 unset %barna_saquit_q_count_real
  11555. 11555 unset %barna_saquit_q_item.*
  11556. 11556 unset %barna_saquit_q_due.*
  11557. 11557 unset %barna_saquit_q_slot.*
  11558. 11558 .timerBarnaSAQUITPump off
  11559. 11559}
  11560. 11560
  11561. 11561alias _barna_saquit_q_pump {
  11562. 11562 ; VARHYGIENE40:
  11563. 11563 ; La cola diferida SAQUIT queda desactivada porque podia acumular cientos de variables
  11564. 11564 ; y provocar lag. Si quedan restos antiguos, se purgan sin tocar canales ni ASN.
  11565. 11565 if (%barna_addon != 1) {
  11566. 11566 .timerBarnaSAQUITPump off
  11567. 11567 return
  11568. 11568 }
  11569. 11569
  11570. 11570 if ($var(%barna_saquit_q_item.*,0) > 0) unset %barna_saquit_q_item.*
  11571. 11571 if ($var(%barna_saquit_q_due.*,0) > 0) unset %barna_saquit_q_due.*
  11572. 11572 if ($var(%barna_saquit_q_slot.*,0) > 0) unset %barna_saquit_q_slot.*
  11573. 11573 unset %barna_saquit_q_head
  11574. 11574 unset %barna_saquit_q_tail
  11575. 11575 unset %barna_saquit_q_count_real
  11576. 11576 .timerBarnaSAQUITPump off
  11577. 11577}
  11578. 11578
  11579. 11579alias barna.saquitdrain {
  11580. 11580 echo -s [ASN] SAQUITDRAIN desactivado en build 40. Purgo cola SAQUIT diferida antigua sin tocar canales/ASN.
  11581. 11581 _barna_saquit_q_pump
  11582. 11582}
  11583. 11583
  11584. 11584alias barna.saquitpurge {
  11585. 11585 ; Limpieza manual de emergencia de SAQUIT. No toca canales ni ASN.
  11586. 11586 .timerBarnaSAQUITPump off
  11587. 11587 unset %barna_saquit_ip.*
  11588. 11588 unset %barna_saquit_chans.*
  11589. 11589 unset %barna_saquit_pending.*
  11590. 11590 unset %barna_saquit_timer.*
  11591. 11591 unset %barna_saquit_sent.*
  11592. 11592 unset %barna_saquit_msg.*
  11593. 11593 unset %barna_saquit_showchans.*
  11594. 11594 unset %barna_saquit_q_item.*
  11595. 11595 unset %barna_saquit_q_due.*
  11596. 11596 unset %barna_saquit_q_slot.*
  11597. 11597 unset %barna_saquit_q_head
  11598. 11598 unset %barna_saquit_q_tail
  11599. 11599 unset %barna_saquit_q_count_real
  11600. 11600 echo -s [ASN] SAQUITPURGE ejecutado. Cola SAQUIT purgada sin tocar canales/ASN.
  11601. 11601}
  11602. 11602
  11603. 11603alias _barna_schedule_delayed_saquit {
  11604. 11604 ; VARHYGIENE41:
  11605. 11605 ; SAQUIT diferido real de 120 segundos, sin usar cola masiva %barna_saquit_q_*.
  11606. 11606 ; Se programa un unico timer por nick y se conserva el estado minimo.
  11607. 11607 ; Si el nick ya no esta al vencer el timer, _barna_delayed_saquit cancela y limpia.
  11608. 11608 if ($1 == $null) return
  11609. 11609 if ($2 == $null) return
  11610. 11610
  11611. 11611 var %nick = $1
  11612. 11612 var %ip = $2
  11613. 11613 var %chans = $3-
  11614. 11614 var %ln = $lower(%nick)
  11615. 11615 var %delay = %barna_saquit_delay
  11616. 11616
  11617. 11617 if ($_barna_is_join_exception(%nick)) {
  11618. 11618 _barna_dbg EXCEPTIONSAFE no programa SAQUIT: nick= %nick ip= %ip chans= %chans
  11619. 11619 _barna_exception_cleanup_nick %nick
  11620. 11620 return
  11621. 11621 }
  11622. 11622 var %timer
  11623. 11623
  11624. 11624 if (%delay !isnum 30-) var %delay = 120
  11625. 11625 if (%delay < 120) var %delay = 120
  11626. 11626
  11627. 11627 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  11628. 11628 if (%chans == $null) return
  11629. 11629
  11630. 11630 ; Si habia un timer anterior para el mismo nick, se reemplaza para evitar duplicados.
  11631. 11631 var %oldtimer = [ [ $+(%,barna_saquit_timer.,%ln) ] ]
  11632. 11632 if (%oldtimer != $null) .timer $+ %oldtimer off
  11633. 11633
  11634. 11634 ; Limpia cualquier resto antiguo de cola para este nick, pero no usa cola nueva.
  11635. 11635 var %oldslot = [ [ $+(%,barna_saquit_q_slot.,%ln) ] ]
  11636. 11636 if (%oldslot isnum 1-) {
  11637. 11637 unset %barna_saquit_q_item. $+ %oldslot
  11638. 11638 unset %barna_saquit_q_due. $+ %oldslot
  11639. 11639 set -u2 $+(%,barna_saquit_q_slot.,%ln) 0
  11640. 11640 }
  11641. 11641
  11642. 11642 set -u600 %barna_saquit_ip. $+ %ln %ip
  11643. 11643 set -u600 %barna_saquit_chans. $+ %ln %chans
  11644. 11644 set -u600 %barna_saquit_pending. $+ %ln 1
  11645. 11645
  11646. 11646 var %timer = BarnaSAQUIT_ $+ $ticks
  11647. 11647 set -u600 %barna_saquit_timer. $+ %ln %timer
  11648. 11648
  11649. 11649 _barna_dbg SAQUIT diferido programado sin cola: nick= %nick ip= %ip chans= %chans delay= %delay
  11650. 11650
  11651. 11651 .timer $+ %timer 1 %delay _barna_delayed_saquit %nick
  11652. 11652
  11653. 11653 ; Si quedan restos de la cola antigua, el pump solo purga restos, no procesa sanciones.
  11654. 11654 if ($var(%barna_saquit_q_item.*,0) == 0) {
  11655. 11655 unset %barna_saquit_q_head
  11656. 11656 unset %barna_saquit_q_tail
  11657. 11657 unset %barna_saquit_q_count_real
  11658. 11658 .timerBarnaSAQUITPump off
  11659. 11659 }
  11660. 11660}
  11661. 11661
  11662. 11662alias _barna_delayed_saquit {
  11663. 11663 if ($1 == $null) return
  11664. 11664
  11665. 11665 var %nick = $1
  11666. 11666 var %ln = $lower(%nick)
  11667. 11667 var %ip = [ [ $+(%,barna_saquit_ip.,%ln) ] ]
  11668. 11668 if (%ip == $null) var %ip = $_barna_ip_get(%nick)
  11669. 11669 var %chans = [ [ $+(%,barna_saquit_chans.,%ln) ] ]
  11670. 11670 var %msg = [ [ $+(%,barna_saquit_msg.,%ln) ] ]
  11671. 11671 var %showchans = [ [ $+(%,barna_saquit_showchans.,%ln) ] ]
  11672. 11672 var %still = 0
  11673. 11673 var %i = 1
  11674. 11674 var %checkdelay = %barna_saquit_check_delay
  11675. 11675 var %checktimer
  11676. 11676
  11677. 11677 if (%checkdelay !isnum 5-) var %checkdelay = 20
  11678. 11678 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  11679. 11679
  11680. 11680 while (%i <= $numtok(%chans,44)) {
  11681. 11681 var %c = $gettok(%chans,%i,44)
  11682. 11682
  11683. 11683 if (%c != $null) {
  11684. 11684 if ($me ison %c) {
  11685. 11685 if (%nick ison %c) {
  11686. 11686 var %still = 1
  11687. 11687 }
  11688. 11688 }
  11689. 11689 }
  11690. 11690
  11691. 11691 inc %i
  11692. 11692 }
  11693. 11693
  11694. 11694 set -u2 $+(%,barna_saquit_pending.,%ln) 0
  11695. 11695 set -u2 $+(%,barna_saquit_timer.,%ln) 0
  11696. 11696
  11697. 11697 if (%still == 0) {
  11698. 11698 _barna_dbg SAQUIT diferido cancelado, nick ya no esta: nick= %nick ip= %ip chans= %chans
  11699. 11699
  11700. 11700 _barna_saquit_cleanup_nick %nick SAQUIT_NICK_GONE
  11701. 11701
  11702. 11702 return
  11703. 11703 }
  11704. 11704
  11705. 11705 _barna_dbg SAQUIT diferido enviado: nick= %nick ip= %ip chans= %chans check_delay= %checkdelay
  11706. 11706
  11707. 11707 .quote SAQUIT %nick :Ping timeout: 3 minutes.
  11708. 11708
  11709. 11709 set -u300 %barna_saquit_sent. $+ %ln 1
  11710. 11710 _barna_dbg SAQUIT enviado, @Parseline2 esperara QUIT real: nick= %nick ip= %ip
  11711. 11711
  11712. 11712 var %checktimer = BarnaCheck_ $+ %ln $+ _ $+ $ticks
  11713. 11713 .timer $+ %checktimer 1 %checkdelay _barna_check_saquit_result %nick %ip %chans
  11714. 11714}
  11715. 11715
  11716. 11716alias _barna_check_saquit_result {
  11717. 11717 if ($1 == $null) return
  11718. 11718
  11719. 11719 var %nick = $1
  11720. 11720 var %ip = $2
  11721. 11721 var %chans = $3
  11722. 11722 var %still = 0
  11723. 11723 var %i = 1
  11724. 11724 var %finaldelay = %barna_saquit_final_delay
  11725. 11725 var %finaltimer
  11726. 11726
  11727. 11727 if (%finaldelay !isnum 5-) var %finaldelay = 20
  11728. 11728 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  11729. 11729
  11730. 11730 while (%i <= $numtok(%chans,44)) {
  11731. 11731 var %c = $gettok(%chans,%i,44)
  11732. 11732
  11733. 11733 if (%c != $null) {
  11734. 11734 if ($me ison %c) {
  11735. 11735 if (%nick ison %c) {
  11736. 11736 var %still = 1
  11737. 11737 }
  11738. 11738 }
  11739. 11739 }
  11740. 11740
  11741. 11741 inc %i
  11742. 11742 }
  11743. 11743
  11744. 11744 if (%still == 0) {
  11745. 11745 _barna_dbg SAQUIT confirmado OK: nick= %nick ip= %ip
  11746. 11746 _barna_saquit_cleanup_nick %nick SAQUIT_OK
  11747. 11747 return
  11748. 11748 }
  11749. 11749
  11750. 11750 _barna_dbg SAQUIT fallido tras espera, envio segundo SAQUIT y SAPART: nick= %nick ip= %ip chans= %chans final_delay= %finaldelay
  11751. 11751
  11752. 11752 .quote SAQUIT %nick :Ping timeout: 3 minutes.
  11753. 11753
  11754. 11754 var %j = 1
  11755. 11755 while (%j <= $numtok(%chans,44)) {
  11756. 11756 var %chan = $gettok(%chans,%j,44)
  11757. 11757
  11758. 11758 if (%chan != $null) {
  11759. 11759 if ($me ison %chan) {
  11760. 11760 if (%nick ison %chan) {
  11761. 11761 .quote SAPART %nick %chan :Ping timeout: 3 minutes.
  11762. 11762 }
  11763. 11763 }
  11764. 11764 }
  11765. 11765
  11766. 11766 inc %j
  11767. 11767 }
  11768. 11768
  11769. 11769 echo @Parseline2 $timestamp $chr(3) $+ 4 $+ [ASN-ATENCION] $chr(15) $+ SAQUIT no saco a $chr(2) $+ %nick $+ $chr(15) $+ . Enviado segundo SAQUIT + SAPART. IP: $chr(2) $+ %ip $+ $chr(15) Canales: %chans
  11770. 11770
  11771. 11771 var %finaltimer = BarnaFinal_ $+ $lower(%nick) $+ _ $+ $ticks
  11772. 11772 .timer $+ %finaltimer 1 %finaldelay _barna_check_saquit_final %nick %ip %chans
  11773. 11773}
  11774. 11774
  11775. 11775alias _barna_check_saquit_final {
  11776. 11776 if ($1 == $null) return
  11777. 11777
  11778. 11778 var %nick = $1
  11779. 11779 var %ip = $2
  11780. 11780 var %chans = $3
  11781. 11781 var %still = 0
  11782. 11782 var %i = 1
  11783. 11783
  11784. 11784 if (%chans == $null) var %chans = $_barna_seen_get(%nick)
  11785. 11785
  11786. 11786 while (%i <= $numtok(%chans,44)) {
  11787. 11787 var %c = $gettok(%chans,%i,44)
  11788. 11788
  11789. 11789 if (%c != $null) {
  11790. 11790 if ($me ison %c) {
  11791. 11791 if (%nick ison %c) {
  11792. 11792 var %still = 1
  11793. 11793 }
  11794. 11794 }
  11795. 11795 }
  11796. 11796
  11797. 11797 inc %i
  11798. 11798 }
  11799. 11799
  11800. 11800 if (%still == 0) {
  11801. 11801 _barna_dbg SAQUIT/SAPART confirmado OK: nick= %nick ip= %ip
  11802. 11802 _barna_saquit_cleanup_nick %nick SAQUIT_FINAL_OK
  11803. 11803 return
  11804. 11804 }
  11805. 11805
  11806. 11806 _barna_dbg SAQUIT/SAPART fallido, nick sigue en canal: nick= %nick ip= %ip chans= %chans
  11807. 11807
  11808. 11808 echo @Parseline2 $timestamp $chr(3) $+ 4 $+ [ASN-ATENCION] $chr(15) $+ $chr(2) $+ %nick $+ $chr(15) sigue en canal incluso tras segundo SAQUIT + SAPART. IP: $chr(2) $+ %ip $+ $chr(15) Canales: %chans
  11809. 11809
  11810. 11810 _barna_saquit_cleanup_nick %nick SAQUIT_FINAL_FAIL
  11811. 11811}
  11812. 11812
  11813. 11813; ------------------------------------------------------------
  11814. 11814; BLOQUE 10.5
  11815. 11815; SANCION ASN
  11816. 11816; ------------------------------------------------------------
  11817. 11817
  11818. 11818alias _barna_apply_asn_punish {
  11819. 11819 if ($1 == $null) return
  11820. 11820 if ($2 == $null) return
  11821. 11821 if ($3 == $null) return
  11822. 11822 if ($4 == $null) return
  11823. 11823
  11824. 11824 var %nick = $1
  11825. 11825 var %ip = $2
  11826. 11826 var %asn = $_barna_norm_asn($3)
  11827. 11827 var %chans = $4
  11828. 11828 var %msg = $5-
  11829. 11829 var %ln = $lower(%nick)
  11830. 11830
  11831. 11831 ; Build 135: comprobacion final inmediatamente antes de sancionar.
  11832. 11832 ; Si el ASN fue borrado mientras la consulta estaba en curso, se cancela.
  11833. 11833 var %activechans = $_barna_asn_filter_active_chans(%asn,%chans)
  11834. 11834 if (%activechans == $null) {
  11835. 11835 _barna_dbg PREFIX_OWNER_GUARD sancion cancelada: ASN ya no activo. nick= %nick ip= %ip asn= %asn canales_originales= %chans
  11836. 11836 var %pc = 1
  11837. 11837 while (%pc <= $numtok(%chans,44)) {
  11838. 11838 var %pchan = $gettok(%chans,%pc,44)
  11839. 11839 if (%pchan != $null) noop $_barna_bad_prefix_prune_channel(%pchan)
  11840. 11840 inc %pc
  11841. 11841 }
  11842. 11842 return
  11843. 11843 }
  11844. 11844
  11845. 11845 var %chans = %activechans
  11846. 11846 var %showchans = $replace(%chans,$chr(44),$+(,$chr(32)))
  11847. 11847
  11848. 11848 if ($_barna_is_join_exception(%nick)) {
  11849. 11849 _barna_dbg EXCEPTIONSAFE ASN match ignorado por excepcion ON JOIN: nick= %nick ip= %ip canales= %chans
  11850. 11850 _barna_exception_cleanup_nick %nick
  11851. 11851 return
  11852. 11852 }
  11853. 11853
  11854. 11854 if ($_barna_is_privileged_nick(%nick)) {
  11855. 11855 _barna_dbg PRIVSAFE ASN match ignorado por @/+v: nick= %nick ip= %ip canales= %chans
  11856. 11856 _barna_privileged_cleanup_nick %nick ASN_PUNISH
  11857. 11857 return
  11858. 11858 }
  11859. 11859
  11860. 11860 _barna_bad_prefix_store %ip %asn %chans
  11861. 11861 _barna_mark_badnick %nick %ip %chans
  11862. 11862
  11863. 11863 set -u900 %barna_hunted. $+ %ln 1
  11864. 11864 set -u900 %barna_saquit_msg. $+ %ln %msg
  11865. 11865 set -u900 %barna_saquit_showchans. $+ %ln %showchans
  11866. 11866
  11867. 11867 _barna_dbg ASN MATCH SHUN por IP/nick y SAQUIT diferido: nick= %nick ip= %ip asn= %asn canales= %chans
  11868. 11868
  11869. 11869 _barna_dbg Parseline2 pendiente hasta QUIT por ASN match: nick= %nick ip= %ip asn= %asn chans= %chans
  11870. 11870
  11871. 11871 _barna_shun_ip %ip Molestias en Canales (A)
  11872. 11872 _barna_shun_nick %nick Molestias en Canales (A)
  11873. 11873 _barna_schedule_delayed_saquit %nick %ip %chans
  11874. 11874}
  11875. 11875
  11876. 11876; ------------------------------------------------------------
  11877. 11877; BLOQUE 11
  11878. 11878; ACCIONES DIFERIDAS COMPATIBLES
  11879. 11879; ------------------------------------------------------------
  11880. 11880
  11881. 11881alias _sacando_do {
  11882. 11882 if ($1 == $null) return
  11883. 11883
  11884. 11884 .quote SAQUIT $1 :Ping timeout: 3 minutes.
  11885. 11885}
  11886. 11886
  11887. 11887alias _shun_do {
  11888. 11888 if ($1 == $null) return
  11889. 11889
  11890. 11890 _barna_shun_nick $1 Molestias en Canales (A)
  11891. 11891}
  11892. 11892
  11893. 11893; ------------------------------------------------------------
  11894. 11894; BLOQUE 12
  11895. 11895; CONSULTA MANUAL POR IP
  11896. 11896; ------------------------------------------------------------
  11897. 11897
  11898. 11898alias asn {
  11899. 11899 if ($1 == $null) {
  11900. 11900 echo -a $chr(3) $+ 4 $+ Uso: $chr(15) $+ /asn <ip>
  11901. 11901 return
  11902. 11902 }
  11903. 11903
  11904. 11904 if (!$_barna_is_ipv4($1)) {
  11905. 11905 echo -a $chr(3) $+ 4 $+ IP no válida: $chr(15) $+ $1
  11906. 11906 return
  11907. 11907 }
  11908. 11908
  11909. 11909 var %id = asnmanual_ $+ $ticks
  11910. 11910
  11911. 11911 set -u30 %barna_manual_ip. $+ %id $1
  11912. 11912 set -u30 %barna_manual_win. $+ %id $active
  11913. 11913 unset %barna_manual_asn. $+ %id
  11914. 11914 unset %barna_manual_name. $+ %id
  11915. 11915 unset %barna_manual_done. $+ %id
  11916. 11916
  11917. 11917 sockopen -e %id api.ipinfo.io 443
  11918. 11918}
  11919. 11919
  11920. 11920; ------------------------------------------------------------
  11921. 11921; BLOQUE 13
  11922. 11922; CONSULTA MANUAL POR NICK
  11923. 11923; ------------------------------------------------------------
  11924. 11924
  11925. 11925alias asn.nick {
  11926. 11926 if ($1 == $null) {
  11927. 11927 echo -a $chr(3) $+ 4 $+ Uso: $chr(15) $+ /asn.nick <nick>
  11928. 11928 return
  11929. 11929 }
  11930. 11930
  11931. 11931 var %nick = $1
  11932. 11932 var %ln = $lower(%nick)
  11933. 11933
  11934. 11934 set -u20 %barna_manual_wait. $+ %ln 1
  11935. 11935 set -u20 %barna_manual_win_nick. $+ %ln $active
  11936. 11936
  11937. 11937 _barna_whoip_send %nick
  11938. 11938}
  11939. 11939
  11940. 11940; ------------------------------------------------------------
  11941. 11941; BLOQUE 14
  11942. 11942; SOCKET MANUAL
  11943. 11943; ------------------------------------------------------------
  11944. 11944
  11945. 11945alias _barna_manual_timer_name {
  11946. 11946 if ($1 == $null) return
  11947. 11947 return BarnaManualTO_ $+ $remove($1,asnmanual_)
  11948. 11948}
  11949. 11949
  11950. 11950alias _barna_manual_timeout_start {
  11951. 11951 if ($1 == $null) return
  11952. 11952
  11953. 11953 var %tn = $_barna_manual_timer_name($1)
  11954. 11954 var %to = 10
  11955. 11955
  11956. 11956 .timer $+ %tn off
  11957. 11957 .timer $+ %tn 1 %to _barna_manual_sock_timeout $1
  11958. 11958}
  11959. 11959
  11960. 11960alias _barna_manual_timeout_stop {
  11961. 11961 if ($1 == $null) return
  11962. 11962
  11963. 11963 var %tn = $_barna_manual_timer_name($1)
  11964. 11964 if (%tn != $null) .timer $+ %tn off
  11965. 11965}
  11966. 11966
  11967. 11967alias _barna_manual_sock_timeout {
  11968. 11968 if ($1 == $null) return
  11969. 11969
  11970. 11970 if ([ [ $+(%,barna_manual_done.,$1) ] ] == 1) {
  11971. 11971 _barna_manual_timeout_stop $1
  11972. 11972 return
  11973. 11973 }
  11974. 11974
  11975. 11975 if ([ [ $+(%,barna_manual_ip.,$1) ] ] == $null) {
  11976. 11976 _barna_manual_timeout_stop $1
  11977. 11977 return
  11978. 11978 }
  11979. 11979
  11980. 11980 var %win = [ [ $+(%,barna_manual_win.,$1) ] ]
  11981. 11981 if (%win == $null) var %win = Status Window
  11982. 11982
  11983. 11983 if ($sock($1)) sockclose $1
  11984. 11984
  11985. 11985 if ([ [ $+(%,barna_manual_done.,$1) ] ] != 1) {
  11986. 11986 echo %win $timestamp $chr(3) $+ 4 $+ [ASN] $chr(15) $+ Tiempo de espera agotado para la consulta.
  11987. 11987 }
  11988. 11988
  11989. 11989 _barna_manual_cleanup $1
  11990. 11990}
  11991. 11991
  11992. 11992alias _barna_manual_cleanup {
  11993. 11993 if ($1 == $null) return
  11994. 11994
  11995. 11995 _barna_manual_timeout_stop $1
  11996. 11996
  11997. 11997 unset %barna_manual_ip. $+ $1
  11998. 11998 unset %barna_manual_win. $+ $1
  11999. 11999 unset %barna_manual_asn. $+ $1
  12000. 12000 unset %barna_manual_name. $+ $1
  12001. 12001 unset %barna_manual_done. $+ $1
  12002. 12002}
  12003. 12003
  12004. 12004on *:sockopen:asnmanual_*:{
  12005. 12005 if ($sockerr) {
  12006. 12006 var %win = [ [ $+(%,barna_manual_win.,$sockname) ] ]
  12007. 12007 if (%win == $null) var %win = Status Window
  12008. 12008 echo %win $timestamp $chr(3) $+ 4 $+ [ASN] $chr(15) $+ Error abriendo socket.
  12009. 12009 _barna_manual_cleanup $sockname
  12010. 12010 return
  12011. 12011 }
  12012. 12012
  12013. 12013 var %ip = [ [ $+(%,barna_manual_ip.,$sockname) ] ]
  12014. 12014
  12015. 12015 _barna_manual_timeout_start $sockname
  12016. 12016
  12017. 12017 sockwrite -n $sockname GET /lite/ $+ %ip $+ ?token=ecc8eaec4dc0de HTTP/1.1
  12018. 12018 sockwrite -n $sockname Host: api.ipinfo.io
  12019. 12019 sockwrite -n $sockname Connection: close
  12020. 12020 sockwrite -n $sockname Accept: application/json
  12021. 12021 sockwrite -n $sockname Accept-Encoding: identity
  12022. 12022 sockwrite -n $sockname User-Agent: mIRC-BarnaManualASN
  12023. 12023 sockwrite -n $sockname $crlf
  12024. 12024}
  12025. 12025
  12026. 12026on *:sockread:asnmanual_*:{
  12027. 12027 var %linea
  12028. 12028 sockread %linea
  12029. 12029 if ($sockbrk) return
  12030. 12030
  12031. 12031 if ($regex(%linea,/"asn"\s*:\s*"(AS\d+)"/i)) {
  12032. 12032 set -u30 %barna_manual_asn. $+ $sockname $regml(1)
  12033. 12033 }
  12034. 12034 else {
  12035. 12035 if ($regex(%linea,/\b(AS\d+)\b/i)) {
  12036. 12036 set -u30 %barna_manual_asn. $+ $sockname $regml(1)
  12037. 12037 }
  12038. 12038 }
  12039. 12039
  12040. 12040 if ($regex(%linea,/"as_name"\s*:\s*"([^"]+)"/i)) {
  12041. 12041 set -u30 %barna_manual_name. $+ $sockname $regml(1)
  12042. 12042 }
  12043. 12043 else {
  12044. 12044 if ([ [ $+(%,barna_manual_name.,$sockname) ] ] == $null) {
  12045. 12045 if ($regex(%linea,/"name"\s*:\s*"([^"]+)"/i)) {
  12046. 12046 set -u30 %barna_manual_name. $+ $sockname $regml(1)
  12047. 12047 }
  12048. 12048 }
  12049. 12049 }
  12050. 12050
  12051. 12051 var %asn = [ [ $+(%,barna_manual_asn.,$sockname) ] ]
  12052. 12052 var %name = [ [ $+(%,barna_manual_name.,$sockname) ] ]
  12053. 12053
  12054. 12054 if ((%asn != $null) && (%name != $null)) {
  12055. 12055 var %ip = [ [ $+(%,barna_manual_ip.,$sockname) ] ]
  12056. 12056 var %win = [ [ $+(%,barna_manual_win.,$sockname) ] ]
  12057. 12057
  12058. 12058 if (%win == $null) var %win = Status Window
  12059. 12059
  12060. 12060 echo %win $timestamp $chr(3) $+ 12 $+ [ASN] $chr(15) $+ La IP $chr(2) $+ %ip $+ $chr(15) $+ pertenece a $chr(2) $+ %name $+ $chr(15) $+ con ASN $chr(2) $+ %asn $+ $chr(15)
  12061. 12061
  12062. 12062 set -u20 %barna_manual_done. $+ $sockname 1
  12063. 12063 _barna_manual_timeout_stop $sockname
  12064. 12064 sockclose $sockname
  12065. 12065 _barna_manual_cleanup $sockname
  12066. 12066 return
  12067. 12067 }
  12068. 12068}
  12069. 12069
  12070. 12070on *:sockclose:asnmanual_*:{
  12071. 12071 return
  12072. 12072}
  12073. 12073; ------------------------------------------------------------
  12074. 12074; BLOQUE 99
  12075. 12075; GC INTEGRADO JOINFIX
  12076. 12076; ------------------------------------------------------------
  12077. 12077
  12078. 12078alias barna.joinfixgc.run {
  12079. 12079 if (%barna_addon != 1) {
  12080. 12080 .timerbarna_joinfix_gc off
  12081. 12081 return
  12082. 12082 }
  12083. 12083
  12084. 12084 var %before = $var(%barna*joinfix*,0)
  12085. 12085
  12086. 12086 .unset %barna_joinfix_q_item.*
  12087. 12087 .unset %barna_joinfix_q_slot.*
  12088. 12088 .unset %barna_joinfix_q_pending.*
  12089. 12089 .unset %barna_joinfix_q_nick.*
  12090. 12090 .unset %barna_joinfix_q_chans.*
  12091. 12091 .unset %barna_joinfix_q_ts.*
  12092. 12092 .unset %barna_joinfix_q_*
  12093. 12093 .unset %barna_joinfix_q*
  12094. 12094 .unset %barna_joinfix_*
  12095. 12095 .unset %barna_joinfix*
  12096. 12096 .unset %barna*joinfix*
  12097. 12097 .unset %barna*join_fix*
  12098. 12098
  12099. 12099 var %after = $var(%barna*joinfix*,0)
  12100. 12100
  12101. 12101 if (%before >= 100) {
  12102. 12102 echo -a [ASN] JOINFIXGC before= %before after= %after
  12103. 12103 }
  12104. 12104}
  12105. 12105
  12106. 12106alias barna.joinfixgc.on {
  12107. 12107 var %jdelay = %barna_joinfix_gc_delay
  12108. 12108 if (%jdelay !isnum 3-) var %jdelay = 5
  12109. 12109
  12110. 12110 .timerbarna_joinfix_gc 0 %jdelay barna.joinfixgc.run
  12111. 12111 echo -a [ASN] JOINFIXGC activado cada %jdelay segundos
  12112. 12112}
  12113. 12113
  12114. 12114alias barna.joinfixgc.off {
  12115. 12115 .timerbarna_joinfix_gc off
  12116. 12116 echo -a [ASN] JOINFIXGC desactivado
  12117. 12117}
  12118. 12118; ------------------------------------------------------------
  12119. 12119; BLOQUE STATS RAPIDO
  12120. 12120; /barna.stats
  12121. 12121; ------------------------------------------------------------
  12122. 12122
  12123. 12123
  12124. 12124alias barna.varfamilies {
  12125. 12125 echo -a $+( [BARNA-CHECK-INICIO] ,$date,$chr(32),$time,$chr(32),build=,%barna_build )
  12126. 12126 echo -a $+( [BARNA-FAM1] total=,$var(%barna_*,0),$chr(32),chan=,$var(%barna_chan.*,0),$chr(32),asn_cfg=,$var(%barna_asn.*,0),$chr(32),asn_cache_asn=,$var(%barna_asn_cache_asn.*,0),$chr(32),asn_cache_name=,$var(%barna_asn_cache_name.*,0),$chr(32),asn_cache_ts=,$var(%barna_asn_cache_ts.*,0),$chr(32),cachecap117=,%barna_cachecap117_enabled,$chr(32),hard=,%barna_asn_cache_hard_limit,$chr(32),batch=,%barna_cachecap117_batch )
  12127. 12127 echo -a $+( [BARNA-FAM2] whoip_all=,$var(%barna_userip_*,0),$chr(32),q_item=,$var(%barna_userip_q_item.*,0),$chr(32),q_chans=,$var(%barna_userip_q_chans.*,0),$chr(32),q_pending=,$var(%barna_userip_q_pending.*,0),$chr(32),inflight=,$var(%barna_userip_inflight.*,0) )
  12128. 12128 echo -a $+( [BARNA-FAM3] lookup=,$var(%barna_lookup.*,0),$chr(32),lookup_chans=,$var(%barna_lookup_chans.*,0),$chr(32),qry=,$var(%barna_qry.*,0),$chr(32),ipdone=,$var(%barna_ipdone.*,0),$chr(32),last_ip=,$var(%barna_last_ip.*,0),$chr(32),ip_keep=,$var(%barna_ip_keep.*,0) )
  12129. 12129 echo -a $+( [BARNA-FAM4] sock_us=,$var(%barna_sock_*,0),$chr(32),sock_dot=,$var(%barna_sock.*,0),$chr(32),sock_name=,$var(%barna_sock_name.*,0),$chr(32),sock_nick=,$var(%barna_sock_nick.*,0),$chr(32),sock_ip=,$var(%barna_sock_ip.*,0),$chr(32),rx=,$var(%barna_rx.*,0),$chr(32),done=,$var(%barna_asn_done.*,0) )
  12130. 12130 echo -a $+( [BARNA-FAM5] tempip=,$var(%temp_ip_*,0),$chr(32),asn_val=,$var(%asn_val.*,0),$chr(32),as_name=,$var(%as_name_val.*,0),$chr(32),echo_asn=,$var(%barna_echo_asn_seen.*,0),$chr(32),echo_seen=,$var(%barna_echo_seen.*,0),$chr(32),echo_q_vars=,$var(%barna_echo_q_*,0),$chr(32),echo_q_head=,%barna_echo_q_head,$chr(32),echo_q_tail=,%barna_echo_q_tail )
  12131. 12131 echo -a $+( [BARNA-FAM6] q_pending=,$var(%barna_q_pending.*,0),$chr(32),q_active=,$var(%barna_q_active.*,0),$chr(32),q_state=,$var(%barna_q_state.*,0),$chr(32),q_ip=,$var(%barna_q_ip.*,0),$chr(32),q_chans=,$var(%barna_q_chans.*,0),$chr(32),q_try=,$var(%barna_q_try.*,0),$chr(32),q_items=,$numtok(%barna_q_items,44),$chr(32),q_low_items=,$numtok(%barna_q_low_items,44) )
  12132. 12132 echo -a $+( [BARNA-FAM7] seen=,$var(%barna_seen.*,0),$chr(32),seen_display=,$var(%barna_seen_display.*,0),$chr(32),seen_rescue=,$var(%barna_seen_rescue*,0),$chr(32),autonickscan_recent=,$var(%barna_autonickscan_recent.*,0),$chr(32),badnick=,$var(%barna_badnick*,0),$chr(32),jguard=,$var(%barna_jguard*,0),$chr(32),saquit=,$var(%barna_saquit*,0) )
  12133. 12133 echo -a $+( [BARNA-FAM8] sockets=,$sock(*,0),$chr(32),ipinfo_sockets=,$_barna_ipinfo_sock_count,$chr(32),sock_state=,$_barna_sockvar_count,$chr(32),whoip_count=,$_barna_userip_q_count )
  12134. 12134 echo -a $+( [BARNA-CHECK-FIN] ,$date,$chr(32),$time )
  12135. 12135}
  12136. 12136
  12137. 12137alias barna.stats {
  12138. 12138 echo -a [ASN-METRICS] build= %barna_build total_vars= $var(%barna_*,0) totalmax= %barna_total_max_vars core_minimal= %barna_core_minimal no_shed= %barna_userip_no_shed lightvars= %barna_whoip_lightvars
  12139. 12139
  12140. 12140 echo -a [ASN-METRICS] cacheASN= $var(%barna_asn_cache_asn.*,0) cacheISP= $var(%barna_asn_cache_name.*,0) cacheTS= $var(%barna_asn_cache_ts.*,0) cachecap117= %barna_cachecap117_enabled hard= %barna_asn_cache_hard_limit batch= %barna_cachecap117_batch lookup= $var(%barna_lookup.*,0) qry= $var(%barna_qry.*,0) sockets_reales= $sock(*,0) sock_state= $_barna_sockvar_count
  12141. 12141
  12142. 12142 echo -a [ASN-METRICS] whoip_vars= $var(%barna_userip_*,0) whoip_q_real= $_barna_userip_q_count whoip_q_vars= $var(%barna_userip_q_*,0) last_ip= $var(%barna_last_ip.*,0) ip_keep= $var(%barna_ip_keep.*,0) ipdone= $var(%barna_ipdone.*,0) saquit= $var(%barna_saquit*,0)
  12143. 12143
  12144. 12144 echo -a [ASN-METRICS] seen= $var(%barna_seen.*,0) seen_display= $var(%barna_seen_display.*,0) noseen= 1 badnick_chans= $var(%barna_badnick_chans.*,0) pending= $var(%barna_pending.*,0) qstate= $var(%barna_qstate.*,0) qitems= %barna_q_items qrunning= %barna_q_running
  12145. 12145
  12146. 12146 echo -a [ASN-METRICS] jguard= $var(%barna_jguard*,0) seenguard= $var(%barna_seen_rescue_recent.*,0) autonickscan= %barna_autonickscan join_delay= %barna_join_delay_secs join_delay_pending= $_barna_join_delay_count join_delay_vars= $var(%barna_join_delay_*,0) autoscan_recent= $var(%barna_autonickscan_recent.*,0) echo_seen= $var(%barna_echo_seen.*,0) echo_asn_seen= $var(%barna_echo_asn_seen.*,0) echo_q_vars= $var(%barna_echo_q_*,0) echo_q_head= %barna_echo_q_head echo_q_tail= %barna_echo_q_tail rx= $var(%barna_rx.*,0) asn_done= $var(%barna_asn_done.*,0)
  12147. 12147}

Pasta cruda

Comments 0
Login to join the discussion.
  • No comments yet — be the first.
Login to post a comment. Iniciar sesión/Registro
Usamos cookies. Para cumplir con el RGPD en la UE y el Reino Unido, debemos mostrárselas.

Utilizamos cookies y tecnologías similares para mantener este sitio web funcional (incluida la protección contra spam a través de Google reCAPTCHA o Cloudflare Turnstile) y, con su consentimiento, para medir el uso y mostrar anuncios. See Privacy.