Documentación final proyecto completado
- docs/PROYECTO_COMPLETO.md: v1.2, SMTP STARTTLS documentado - docs/DIARIO_DESARROLLO.md: Sesión 3 con migración Zig 0.15 y SMTP 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
4a9d0e62e0
commit
dbcf8c696b
2 changed files with 134 additions and 12 deletions
|
|
@ -1,5 +1,98 @@
|
||||||
# Diario de Desarrollo - service-monitor
|
# Diario de Desarrollo - service-monitor
|
||||||
|
|
||||||
|
## 2025-12-08 - Sesión 3: Migración Zig 0.15 + SMTP STARTTLS
|
||||||
|
|
||||||
|
### Contexto
|
||||||
|
- Migrar de Zig 0.13 a 0.15.2
|
||||||
|
- Implementar SMTP con STARTTLS para notificaciones por email
|
||||||
|
|
||||||
|
### Migración a Zig 0.15.2
|
||||||
|
|
||||||
|
**Cambios requeridos:**
|
||||||
|
|
||||||
|
| Componente | Antes (0.13) | Después (0.15) |
|
||||||
|
|------------|--------------|----------------|
|
||||||
|
| build.zig | `root_source_file` | `root_module` con `b.createModule()` |
|
||||||
|
| stdout | `std.io.getStdOut().writer()` | `std.fs.File.stdout().deprecatedWriter()` |
|
||||||
|
| ArrayList | `std.ArrayList(T).init(alloc)` | `std.array_list.Managed(T).init(alloc)` |
|
||||||
|
| file.reader() | sin args | requiere buffer, usar `deprecatedReader()` |
|
||||||
|
| HTTP Client | `client.open()` + `send()` + `wait()` | `client.fetch()` |
|
||||||
|
| sleep | `std.time.sleep()` | `std.Thread.sleep()` |
|
||||||
|
|
||||||
|
**Commits:**
|
||||||
|
- `f31ce95` - Migración a Zig 0.15.2
|
||||||
|
|
||||||
|
### SMTP con STARTTLS
|
||||||
|
|
||||||
|
**Problema inicial:**
|
||||||
|
Se intentó implementar TLS nativo con `std.crypto.tls.Client`, pero la nueva API de I/O
|
||||||
|
de Zig 0.15 resultó demasiado compleja (cambios en Reader/Writer interfaces).
|
||||||
|
|
||||||
|
**Solución adoptada:**
|
||||||
|
Usar curl como subprocess, igual que para Telegram. Ventajas:
|
||||||
|
- curl maneja STARTTLS con `--ssl-reqd` transparentemente
|
||||||
|
- Código mucho más simple y mantenible
|
||||||
|
- Fiable y probado
|
||||||
|
|
||||||
|
**Configuración SMTP (Mailbox.org):**
|
||||||
|
```
|
||||||
|
Host: smtp.mailbox.org
|
||||||
|
Puerto: 587 (STARTTLS)
|
||||||
|
Usuario: reugenio@mailbox.org
|
||||||
|
Password: App password (en NOTIFICACIONES.md)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Commits:**
|
||||||
|
- `4a9d0e6` - SMTP con STARTTLS via curl
|
||||||
|
|
||||||
|
### Estado Final del Proyecto
|
||||||
|
|
||||||
|
**Todas las funcionalidades implementadas:**
|
||||||
|
- ✅ Verificación HTTP/HTTPS
|
||||||
|
- ✅ Verificación TCP
|
||||||
|
- ✅ Modo watch (loop continuo)
|
||||||
|
- ✅ Modo daemon (background)
|
||||||
|
- ✅ Log a archivo
|
||||||
|
- ✅ Config externo (CSV)
|
||||||
|
- ✅ Notificación desktop (notify-send)
|
||||||
|
- ✅ Notificación Telegram (Bot API via curl)
|
||||||
|
- ✅ Notificación Email (SMTP STARTTLS via curl)
|
||||||
|
|
||||||
|
**Estructura final:**
|
||||||
|
```
|
||||||
|
service-monitor/
|
||||||
|
├── build.zig
|
||||||
|
├── CLAUDE.md
|
||||||
|
├── services.conf
|
||||||
|
├── docs/
|
||||||
|
│ ├── DIARIO_DESARROLLO.md
|
||||||
|
│ └── PROYECTO_COMPLETO.md
|
||||||
|
└── src/
|
||||||
|
├── main.zig # Entry point + CLI
|
||||||
|
├── http.zig # Cliente HTTP (fetch API)
|
||||||
|
├── tcp.zig # Verificación TCP
|
||||||
|
├── config.zig # Parser CSV
|
||||||
|
├── notify.zig # notify-send
|
||||||
|
├── daemon.zig # fork + setsid
|
||||||
|
├── smtp.zig # SMTP via curl
|
||||||
|
└── telegram.zig # Bot API via curl
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2025-12-07 - Sesión 2: Fases 2 y 3
|
||||||
|
|
||||||
|
### Implementado
|
||||||
|
- Modo watch con intervalo configurable
|
||||||
|
- Modo daemon con fork/setsid
|
||||||
|
- Log a archivo
|
||||||
|
- Config externo (services.conf)
|
||||||
|
- Notificaciones desktop (notify-send)
|
||||||
|
- Notificaciones Telegram (Bot API)
|
||||||
|
- SMTP básico (sin STARTTLS)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 2025-12-07 - Sesión 1: Inicio proyecto
|
## 2025-12-07 - Sesión 1: Inicio proyecto
|
||||||
|
|
||||||
### Contexto
|
### Contexto
|
||||||
|
|
@ -40,10 +133,6 @@ service-monitor/
|
||||||
- Código idiomático Zig (snake_case, error handling explícito)
|
- Código idiomático Zig (snake_case, error handling explícito)
|
||||||
- Preparado para open source
|
- Preparado para open source
|
||||||
|
|
||||||
### Pendiente - Fases 2 y 3
|
|
||||||
- [ ] Fase 2: Modo daemon + intervalo configurable + logs
|
|
||||||
- [ ] Fase 3: Notificaciones (libnotify, webhook, email)
|
|
||||||
|
|
||||||
### Comandos
|
### Comandos
|
||||||
```bash
|
```bash
|
||||||
zig build # Compilar
|
zig build # Compilar
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# Service Monitor - Documentación Completa
|
# Service Monitor - Documentación Completa
|
||||||
|
|
||||||
> **Fecha**: 2025-12-08
|
> **Fecha**: 2025-12-08
|
||||||
> **Versión**: 1.1
|
> **Versión**: 1.2
|
||||||
> **Lenguaje**: Zig 0.15.2
|
> **Lenguaje**: Zig 0.15.2
|
||||||
> **Repositorio**: https://git.reugenio.com/reugenio/service-monitor
|
> **Repositorio**: https://git.reugenio.com/reugenio/service-monitor
|
||||||
|
|
||||||
|
|
@ -20,7 +20,7 @@ Monitor de servicios HTTP y TCP para verificar disponibilidad del servidor Hetzn
|
||||||
| Log a archivo | ✅ | Append mode, timestamps ISO |
|
| Log a archivo | ✅ | Append mode, timestamps ISO |
|
||||||
| Config externo | ✅ | Archivo CSV simple |
|
| Config externo | ✅ | Archivo CSV simple |
|
||||||
| Notificación desktop | ✅ | notify-send (Linux) |
|
| Notificación desktop | ✅ | notify-send (Linux) |
|
||||||
| Notificación email | ✅ | SMTP con AUTH LOGIN (sin TLS) |
|
| Notificación email | ✅ | SMTP con STARTTLS via curl |
|
||||||
| Notificación Telegram | ✅ | Bot API via curl |
|
| Notificación Telegram | ✅ | Bot API via curl |
|
||||||
|
|
||||||
## Estructura del Proyecto
|
## Estructura del Proyecto
|
||||||
|
|
@ -246,11 +246,11 @@ OK Menzuri (456ms)
|
||||||
|
|
||||||
### smtp.zig
|
### smtp.zig
|
||||||
|
|
||||||
- Protocolo SMTP completo (RFC 5321)
|
- Implementación SMTP usando curl como subprocess
|
||||||
- Comandos: EHLO, AUTH LOGIN, MAIL FROM, RCPT TO, DATA, QUIT
|
- Soporte completo STARTTLS (puerto 587)
|
||||||
- Autenticación Base64
|
- Curl maneja TLS de forma transparente
|
||||||
- Múltiples destinatarios
|
- Autenticación con usuario/contraseña
|
||||||
- **Limitación**: No soporta STARTTLS (usar puerto 25 o servidores sin TLS)
|
- Compatible con Gmail, Mailbox.org, Outlook, etc.
|
||||||
|
|
||||||
### telegram.zig
|
### telegram.zig
|
||||||
|
|
||||||
|
|
@ -278,10 +278,12 @@ OK Menzuri (456ms)
|
||||||
| 5a17d74 | Fase 3: Notificaciones desktop |
|
| 5a17d74 | Fase 3: Notificaciones desktop |
|
||||||
| 655dcb8 | Daemon mode + config externo |
|
| 655dcb8 | Daemon mode + config externo |
|
||||||
| a011d9e | SMTP y Telegram |
|
| a011d9e | SMTP y Telegram |
|
||||||
|
| f31ce95 | Migración a Zig 0.15.2 |
|
||||||
|
| 4a9d0e6 | SMTP con STARTTLS via curl |
|
||||||
|
|
||||||
## Pendiente
|
## Pendiente
|
||||||
|
|
||||||
- [ ] SMTP con STARTTLS (para Gmail/Outlook)
|
- [x] ~~SMTP con STARTTLS~~ (completado 2025-12-08 via curl)
|
||||||
- [x] ~~Migración a Zig 0.15~~ (completado 2025-12-08)
|
- [x] ~~Migración a Zig 0.15~~ (completado 2025-12-08)
|
||||||
- [ ] Notificación de recuperación (servicio vuelve a funcionar)
|
- [ ] Notificación de recuperación (servicio vuelve a funcionar)
|
||||||
- [ ] Rate limiting de notificaciones (evitar spam)
|
- [ ] Rate limiting de notificaciones (evitar spam)
|
||||||
|
|
@ -300,9 +302,40 @@ La migración a Zig 0.15.2 requirió los siguientes cambios:
|
||||||
| HTTP Client | `client.open()` + `send()` + `wait()` | `client.fetch()` |
|
| HTTP Client | `client.open()` + `send()` + `wait()` | `client.fetch()` |
|
||||||
| sleep | `std.time.sleep()` | `std.Thread.sleep()` |
|
| sleep | `std.time.sleep()` | `std.Thread.sleep()` |
|
||||||
|
|
||||||
|
## Notas de Implementación SMTP con STARTTLS
|
||||||
|
|
||||||
|
La implementación nativa de TLS en Zig 0.15 resultó compleja debido a cambios en la API de I/O.
|
||||||
|
Se optó por usar curl como subprocess, que ofrece:
|
||||||
|
|
||||||
|
- **Simplicidad**: curl maneja STARTTLS transparentemente con `--ssl-reqd`
|
||||||
|
- **Fiabilidad**: curl es estable y bien probado
|
||||||
|
- **Compatibilidad**: Funciona con cualquier servidor SMTP moderno
|
||||||
|
- **Consistencia**: Mismo enfoque que Telegram (también usa curl)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Equivalente manual:
|
||||||
|
echo -e "From: user@mailbox.org\r\nTo: dest@example.com\r\nSubject: Test\r\n\r\nBody" | \
|
||||||
|
curl -s --url "smtp://smtp.mailbox.org:587" --ssl-reqd \
|
||||||
|
-u "user@mailbox.org:password" \
|
||||||
|
--mail-from "<user@mailbox.org>" \
|
||||||
|
--mail-rcpt "<dest@example.com>" -T -
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuración SMTP Actual
|
||||||
|
|
||||||
|
| Parámetro | Valor |
|
||||||
|
|-----------|-------|
|
||||||
|
| Servidor | smtp.mailbox.org |
|
||||||
|
| Puerto | 587 (STARTTLS) |
|
||||||
|
| Usuario | reugenio@mailbox.org |
|
||||||
|
| Tipo password | App password (solo envío) |
|
||||||
|
|
||||||
|
**Nota**: Credenciales completas en `TEAM_STANDARDS/INFRASTRUCTURE/NOTIFICACIONES.md`
|
||||||
|
|
||||||
## Referencias
|
## Referencias
|
||||||
|
|
||||||
- Zig 0.15 stdlib: https://ziglang.org/documentation/0.15.0/std/
|
- Zig 0.15 stdlib: https://ziglang.org/documentation/0.15.0/std/
|
||||||
- SMTP RFC 5321: https://tools.ietf.org/html/rfc5321
|
- SMTP RFC 5321: https://tools.ietf.org/html/rfc5321
|
||||||
- Telegram Bot API: https://core.telegram.org/bots/api
|
- Telegram Bot API: https://core.telegram.org/bots/api
|
||||||
- Guía Zig 0.15: /mnt/cello2/arno/re/recode/TEAM_STANDARDS/INFRASTRUCTURE/ZIG_0.15_GUIA.md
|
- Guía Zig 0.15: /mnt/cello2/arno/re/recode/TEAM_STANDARDS/INFRASTRUCTURE/ZIG_0.15_GUIA.md
|
||||||
|
- Credenciales: /mnt/cello2/arno/re/recode/TEAM_STANDARDS/INFRASTRUCTURE/NOTIFICACIONES.md
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue