Linaje y licencia
Partes de mikroscope empezaron como código de cs-routeros-bouncer, ghchronicle y
go-routeros, todos con licencia MIT. Abajo: qué paquetes, qué cambió al traerlos
y la licencia. La atribución está también en el código, de modo que sobrevive a que se lea sin
este sitio: en el comentario de documentación del paquete de internal/router/,
del constructor de imágenes internal/image/, del gráfico internal/chart/
y del generador de dashboards internal/dashboards/; en los propios
ficheros del cliente de la API, internal/ y internal/rosapi/LICENSE;
y en la cabecera de .golangci.yml.
Origen del muestreador
Sección titulada «Origen del muestreador»El muestreador que demostró que esto funciona es cmd/perfmon en
cs-routeros-bouncer,
construido para una prueba de rendimiento y conservado allí como instrumento de
desarrollo. Los pasos de despliegue, el constructor de imágenes sin Docker, el
gráfico determinista y el cliente de la API de RouterOS incorporado vienen de
ese repositorio, bajo su licencia MIT.
Paquetes importados
Sección titulada «Paquetes importados»| mikroscope | Tomado de | Qué cambió por el camino |
|---|---|---|
internal/router |
cs-routeros-bouncer cmd/perfmon, los pasos de despliegue tras el PR #123 |
Ampliado con puertos entrecomillados en cada find, el par opcional de reglas de cortafuegos de --expose, los ajustes de contenedor propios de mikroscope y un listado de cada escritura antes de hacerla |
Pruebas de internal/router |
cs-routeros-bouncer cmd/perfmon, las pruebas de contención |
Adaptadas a los nombres de opción de mikroscope y a dos reglas propias: puertos entrecomillados, y el par de --expose como parte del plan |
internal/image |
cs-routeros-bouncer cmd/perfmon/image.go |
Rehecho para el nombre del agente, la variante ARM (una imagen arm declara su nivel GOARM: v5 por defecto, v7 con --goarm 7) y una compilación que goreleaser pueda reutilizar |
internal/chart |
cs-routeros-bouncer cmd/perfmon/chart.go |
El original tomaba su paleta de un tema de documentación; este lleva la suya propia, validada para la superficie clara (ΔE CVD entre pares adyacentes 9,1, visión normal 22,9) |
internal/rosapi |
cs-routeros-bouncer internal/rosapi, tomado el 2026-09-11 |
La ruta de importación; desde entonces, solo pruebas y el README del paquete (1.0.1, 1.1.0), nada del código que se envía |
.golangci.yml |
ghchronicle y gitlab-mcp-server, basados a su vez en maratori/ |
La ruta del módulo |
Desliza en horizontal para ver todas las columnas
Lo que trajo el PR #123, y lo que el instalador de mikroscope conserva de él, es
la regla de contención: cada objeto creado lleva una única etiqueta exacta en
el comentario, cada retirada selecciona por esa etiqueta más la identidad del
objeto (nunca por patrón), y uninstall verifica por recuento de propiedad
antes de dar el éxito por bueno. No se escribe nada sin haberlo listado antes.
La salida del gráfico es determinista: la misma entrada da siempre los mismos bytes.
Diseños tomados como modelo
Sección titulada «Diseños tomados como modelo»El modelo es ghchronicle, el otro
proyecto de telemetría del mantenedor de mikroscope, José Manuel Requena Plens, que
recoge lo que GitHub informa sobre una cuenta. internal/dashboards toma la
forma de exportación de Grafana del
cmd/gen_dashboards
de ghchronicle — “the shape, not the code”, como dice su comentario de paquete —
y dashboards check comprueba cada panel en un Grafana real igual que lo hace
ghchronicle. Otras dos piezas se modelaron igual sobre ghchronicle, la forma y
no el código. Las secciones con nombre de los paneles, la primera abierta y todas
las demás plegadas, siguen su
internal/;
la lista de mikroscope es internal/. Y la
batería de extremo a extremo de test/e2e/ sigue
el test/e2e/ de ghchronicle,
que compila su binario y lo ejecuta contra un GitHub simulado, con un fichero de
prueba por destino.
Cliente de la API de RouterOS
Sección titulada «Cliente de la API de RouterOS»internal/rosapi tiene dos generaciones de linaje. La copia de mikroscope es
la de cs-routeros-bouncer, sin nada modificado en el código que se envía. Lo que ha
cambiado desde entonces son pruebas y el propio README.md del paquete: 1.0.1 añadió un
único skip de Windows a client_test.go; 1.1.0 añadió dos pruebas de cobertura
(dial_cover_test.go, unknownreply_), amplió proto_test.go y anotó ese
skip de 1.0.1 en la nota de linaje del README.md. mikroscope la
usa para las lecturas de la capa de la API, para mark --log-markers y para el
relevo de /tool fetch.
La copia del bouncer es a su vez una incorporación recortada de
github.com/
en v3.0.1 (commit de upstream del 2025-02-16), MIT, copyright 2016 André
Luiz dos Santos, cuyo fichero LICENSE sigue en el paquete.
Por qué se incorpora
Sección titulada «Por qué se incorpora»Upstream está en la práctica sin mantener: su último commit es dieciocho meses
anterior a la copia, y las pull requests e issues abiertas contra el modo
asíncrono a mediados de 2026 (#31–#34) no han tenido respuesta de ningún
mantenedor. No existe una alternativa mantenida: swoga/go-routeros es una
copia que solo recibe actualizaciones de dependabot para sus GitHub Actions, y
jda/routeros-api-go se detuvo en 2016. Incorporarlo mantiene el código
compilable y permite a la copia corregir y recortar lo que usa.
Cambios respecto a upstream
Sección titulada «Cambios respecto a upstream»Estos cambios se hicieron en cs-routeros-bouncer y llegan sin tocar:
- Se elimina el modo async/listen, con sus pruebas y la rama asíncrona de
RunArgsContext. Nada en el bouncer llamaba aAsync(),Listen()ni a las variantes de ejecución que cancelan por contexto. Las constantes de tipo de sentencia pasaron areply.go, que es quien las consume. - El lector y el escritor del protocolo leen y escriben directamente, en
vez de despachar cada llamada a una goroutine nueva con un canal y un búfer
de copia; solo el modo asíncrono eliminado cancelaba alguna vez una lectura
en curso. A la escala de producción del bouncer (22k entradas de
address-list obtenidas en cada ciclo) esa capa costaba ~294 000 goroutines
lanzadas, ~62 MB de basura y ~76 % de todas las asignaciones por ciclo de
reconciliación. La reescritura se comprobó contra upstream intacto con una
prueba diferencial: la huella SHA-256 sobre las 22 037 sentencias analizadas
idéntica, las formas de error idénticas (
io.ErrUnexpectedEOFal truncar,*DeviceErroren!trap), y la batería de upstream en verde congo test -race.proto/fija ese comportamiento. Esas cuatro cifras son de cs-routeros-bouncer, medidas en su propia máquina y contra su propia carga, no en un router y no por este proyecto;reader_ shape_ test.go internal/, de donde salen, no registra ni fecha ni equipo, así que aquí no se puede dar ninguno de los dos.rosapi/ README.md - Se elimina el inicio de sesión MD5 por desafío anterior a 6.43. Ese
inicio de sesión solo existe antes de RouterOS 6.43 (2018), y responderlo
supone hacer un hash MD5 de la contraseña. Un router que envía un desafío
retrecibeErrLegacyLoginUnsupporteden su lugar. - Se eliminan las pruebas del modo asíncrono y del modo listen junto con el modo; las pruebas del inicio de sesión anterior a 6.43 comprueban el rechazo en vez del intercambio. El resto de la batería de upstream se conserva y pasa.
Compara con la etiqueta v3.0.1 de upstream, no con su rama master.
Licencia
Sección titulada «Licencia»mikroscope tiene licencia MIT, copyright 2026 José Manuel Requena Plens, a quien la
licencia nombra por su alias, jmrplens; el texto completo está
en LICENSE, en la raíz del repositorio. El código tomado de
cs-routeros-bouncer llega bajo la licencia MIT de ese repositorio, e
internal/rosapi conserva el LICENSE MIT de go-routeros junto al código que
cubre. Lo que cambió cada versión, correcciones de esta página incluidas, está
en CHANGELOG.md.