Commit Graph

3 Commits

Author SHA1 Message Date
Andres Garcia 3ddcadd3f2 feat: monitor en vivo (--watch) y publish --address; interop validada
Añade las dos funciones que Avahi/Bonjour tenían y faltaban:

- `mdns browse --watch`: monitor DNS-SD en vivo (eventos +/=/-), equivalente
  a `avahi-browse -a`. Sin --type descubre tipos dinámicamente via el
  meta-servicio _services._dns-sd._udp.local. y adjunta un browser por tipo.
  Nuevo modulo lib/mdns_tools/watch.py.
- `mdns publish --address <nombre> <ip>`: publica un A record puro
  hostname->IP, equivalente a `avahi-publish -a`.

Robustez del publisher:
- Maneja NonUniqueNameException (probing RFC 6762): si el nombre ya esta
  tomado, deja que zeroconf renombre en vez de crashear.
- `mdns publish` sin --config auto-carga ~/.config/mdns/services.json.

Interoperabilidad validada en LAN real (documentada en README):
- Termux -> Avahi: con `mdns publish` activo, un Linux con nss-mdns resolvio
  `movil.local` y le hizo ping sin configuracion extra (getent + ping OK).
- Avahi -> Termux: `mdns browse` ve los servicios que publican equipos
  Avahi/Bonjour (SMB, SSH, _workstation, Chromecast, AirPlay...).
  Al usar zeroconf (RFC 6762/6763), Mac/Linux/Windows descubren y resuelven
  lo publicado y viceversa, sin cliente especial.

README: seccion de interoperabilidad, tabla RFC ampliada, ejemplos --watch
y --address. bashrc.snippet: alias mdns-watch. publish.py recortado a <100.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-20 08:00:07 -05:00
Andres Garcia 96dcd177ec feat: CLI unificado mdns con browse/reverse/IPv6/cache-TTL
Cierra el gap hacia una implementacion mDNS/DNS-SD completa (RFC 6762/6763).

CLI nuevo `bin/mdns` con subcomandos:
- resolve  : hostname -> IP (IPv4 stdlib rapido, IPv6 via zeroconf), cache TTL.
- reverse  : IP -> hostname (PTR multicast, IPv4/IPv6).
- browse   : descubrimiento DNS-SD (--list-types o --type _ssh._tcp.local.).
- publish  : anuncia hostname + servicios (SSH/SMB/HTTP) con probing y goodbye.
- cache    : list/clear del cache con TTL.

Biblioteca lib/mdns_tools/ (cada modulo < 100 lineas):
- resolve.py: stdlib-first para IPv4, zeroconf fallback para IPv6/miss.
- _stdlib_resolve.py: resolver A puro stdlib, acumula todas las A del host.
- _pick.py: elige la IP mas alcanzable ante multi-homing. Descarta rangos
  virtuales (libvirt 192.168.122/24, docker 172.17/16, link-local) devolviendo
  None para que el caller caiga a Tailscale en vez de a una IP muerta.
- browse.py / publish.py: DNS-SD sobre zeroconf.
- reverse.py: PTR stdlib. cache.py: TTL-aware JSON en ~/.cache/mdns.

Mejoras de calidad:
- IP_ADD_MEMBERSHIP en todos los sockets multicast.
- Retries con backoff (timeout dividido).
- Imports lazy en el CLI (resolve/cache no cargan zeroconf -> ~1s vs ~4s).

Wrappers:
- resolve (bash): orden mdns -> mdns-resolve stdlib -> Tailscale -> cache plano.
- mdns-publish.py: shim compat sobre `mdns publish`, lee ~/.config/mdns/services.json.
- install.sh: symlinks bin/ (updates via git pull), siembra services.json.
- ssh_config.example: HostKeyAlias documentado (alias comparte known_hosts con
  el nombre canonico; evita fallos de verificacion tras reinstalar un host).
- bashrc.snippet: aliases mdns-types/ssh/smb/http, mdns-cache, whor.

Validado E2E en LAN: browse detecta 13 tipos; dell/movil resuelven a IP LAN
real; lenovo (solo publica virbr0 192.168.122.1) cae correctamente a Tailscale;
IPv6 de dell via zeroconf; reverse 192.168.1.17 -> dell-latitude3400.local;
publish visible desde otro browser. Modulos < 100 lineas salvo el dispatcher.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-20 07:06:53 -05:00
Andres Garcia 0b6642ec84 init: extraer herramientas mDNS de claude-code-termux
Scripts (bin/):
- mdns-resolve: resolver .local por multicast UDP (stdlib Python).
- mdns-publish.py: publicar este dispositivo como movil.local (zeroconf).
- ssh-mdns-proxy: ProxyCommand SSH con orden mDNS -> Tailscale -> cache.
- ssh-fallback: ProxyCommand con fallback Tailscale -> LAN.
- resolve: resolver genérico para cualquier comando (ping, curl, kubectl...).

Config (config/):
- bashrc.snippet: aliases r/pingr/curlr/sshr + auto-arranque publisher.
- ssh_config.example: entradas ProxyCommand para .local y hostnames cortos.

Docs y setup:
- README.md standalone con guía de uso, comportamiento por red y gotchas
  (getent ausente en Bionic, shebang bash-only, mDNS no cruza redes,
  zeroconf no sobrevive tar-backups, no silenciar logs).
- install.sh independiente con --dry-run.

Origen: extraído de andresgarcia0313/claude-code-termux para reutilizarse
sin acoplar a Claude Code.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-19 20:53:44 -05:00