
Heric Camargo pushed to branch main at Root / CLI / Mirror Monitor Commits: dba6b08a by Heric Camargo at 2025-08-01T14:59:48-03:00 build: update dockerfile - - - - - 6b2a262d by Heric Camargo at 2025-08-01T14:59:58-03:00 chore: update new endpoints - - - - - 2 changed files: - Containerfile - README.md Changes: ===================================== Containerfile ===================================== @@ -6,9 +6,8 @@ WORKDIR /app # Copia os arquivos do projeto COPY . . -# Compilando o binário server.go -#Atenção: estamos colocando apenas o programa server.go no container, o tui.go continuará fora! -RUN go build -o rsyncuptime server.go +# Compilando o binário da API +RUN go build -o rsyncuptime cmd/api/main.go # Etapa final: FROM debian:bookworm-slim ===================================== README.md ===================================== @@ -1,7 +1,7 @@ # Rsync Uptime Monitor - + Serviço web em Go para monitorar módulos de um servidor `rsync`, com interface TUI para visualização do histórico. @@ -25,19 +25,19 @@ Serviço web em Go para monitorar módulos de um servidor `rsync`, com interface **Servidor:** ```sh -go run server.go +go run cmd/api/main.go ``` Por padrão, o servidor roda na porta 8080. Para customizar variáveis de ambiente: ```sh -RSYNC_URL="rsync://sagres.c3sl.ufpr.br/" POLLING_INTERVAL_SECONDS=60 PORT=9090 go run server.go +RSYNC_URL="rsync://sagres.c3sl.ufpr.br/" POLLING_INTERVAL_SECONDS=60 PORT=9090 go run cmd/api/main.go ``` **Cliente TUI:** ```sh -go run tui.go +go run cmd/tui/main.go ``` No cliente TUI, use `DEBUG=1` para ativar logs detalhados em arquivo (`tui-debug.log`). @@ -49,10 +49,10 @@ No cliente TUI, use `DEBUG=1` para ativar logs detalhados em arquivo (`tui-debug 1. Compile o binário: ```sh - go build -o server server.go + go build -o api cmd/api/main.go ``` -2. Edite o arquivo `rsyncuptime.service` conforme seu ambiente: +2. Edite o arquivo `deploy/rsyncuptime.service` conforme seu ambiente: - `WorkingDirectory`: diretório do binário - `ExecStart`: caminho do binário - Variáveis de ambiente podem ser definidas no próprio arquivo @@ -67,7 +67,7 @@ No cliente TUI, use `DEBUG=1` para ativar logs detalhados em arquivo (`tui-debug [Service] Type=simple WorkingDirectory=/caminho/do/projeto - ExecStart=/caminho/do/projeto/server + ExecStart=/caminho/do/projeto/api Restart=on-failure RestartSec=5 Environment=RSYNC_URL=rsync://sagres.c3sl.ufpr.br/ @@ -81,7 +81,7 @@ No cliente TUI, use `DEBUG=1` para ativar logs detalhados em arquivo (`tui-debug 3. Instale e ative o serviço: ```sh - sudo cp rsyncuptime.service /etc/systemd/system/rsyncuptime.service + sudo cp deploy/rsyncuptime.service /etc/systemd/system/rsyncuptime.service sudo systemctl daemon-reload sudo systemctl enable rsyncuptime sudo systemctl start rsyncuptime @@ -95,7 +95,7 @@ No cliente TUI, use `DEBUG=1` para ativar logs detalhados em arquivo (`tui-debug Execute: ```sh -go test -v +go test -v cmd/api/ ``` Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. @@ -104,23 +104,42 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. ## Exemplos de uso da API -### GET / +### GET /modules ```json { - "message": "Monitoring all discovered modwules. See endpoints below.", - "monitored_modules": { - "debian": "/status/debian", - "ubuntu": "/status/ubuntu" - }, - "path": "/", - "polling_interval_s": 300, - "rsync_directories": ["debian", "ubuntu"], - "success": true + "modules": [ + "debian", + "debian-cd", + "debian-volatile", + "debian-security", + "debian-multimedia", + "debian-backports", + "aptosid", + "turnkeylinux", + "ubuntu", + "releases", + "archlinux", + "fedora", + "gentoo", + "mint" + ], + "polling_interval_s": 300 } ``` -### GET /status/debian (sucesso) +### GET /modules/debian (status atual) + +```json +{ + "is_up": true, + "message": "Operational", + "http_status": 200, + "timestamp": "2025-08-01T14:54:53.280362792-03:00" +} +``` + +### GET /modules/debian/history (histórico completo) ```json [ @@ -131,18 +150,29 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. "message": "Operational", "path": "/debian/", "success": true, - "timestamp": "2025-07-29T13:59:01.433848536-03:00" + "timestamp": "2025-08-01T14:54:53.280362792-03:00" } ] ``` -### GET /status/nonexistent (erro) +### GET /modules/nonexistent (módulo não encontrado) ```json { "code": 404, - "error": "Module 'nonexistent' is not monitored.", - "path": "/status/nonexistent", + "error": "Module 'nonexistent' not found", + "path": "/modules/nonexistent", + "success": false +} +``` + +### GET /modules/test@invalid (nome inválido) + +```json +{ + "code": 400, + "error": "Invalid module name: 'test@invalid'", + "path": "/modules/test@invalid", "success": false } ``` @@ -151,14 +181,18 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. ## Endpoints principais -- `GET /` — Lista módulos monitorados e informações gerais -- `GET /status/<modulo>` — Histórico de status do módulo +- `GET /modules` — Lista todos os módulos monitorados e informações gerais +- `GET /modules/{modulo}` — Status atual do módulo específico +- `GET /modules/{modulo}/history` — Histórico completo de status do módulo +- `GET /status/{modulo}` — **[DEPRECATED]** Redireciona para `/modules/{modulo}` (301 Moved Permanently) **Códigos de resposta:** - 200 OK: módulo operacional -- 400 Bad Request: nome inválido +- 301 Moved Permanently: endpoint `/status/` foi movido para `/modules/` +- 400 Bad Request: nome de módulo inválido ou requisição malformada - 404 Not Found: módulo não existe ou não está sendo monitorado +- 405 Method Not Allowed: método HTTP não permitido para o endpoint - 500 Internal Server Error: erro interno do rsync --- @@ -169,8 +203,10 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. - **Validação de nomes de módulo:** Apenas nomes contendo letras, números, hífen (`-`), underline (`_`) e ponto (`.`) são aceitos. Exemplo válido: `debian-archive`. Isso evita ataques de path traversal e injeção. - **Histórico de status:** Para cada módulo, o servidor armazena o histórico dos últimos 24h de verificações. O número de registros depende do intervalo configurado em `POLLING_INTERVAL_SECONDS`. - **Campos de erro e resposta:** + - **Status atual** (`/modules/{modulo}`): Retorna apenas o último resultado da verificação + - **Histórico completo** (`/modules/{modulo}/history`): Retorna array com todo o histórico armazenado - Em caso de erro, a resposta pode conter os campos `error`, `code`, `rsync_exit_code` (código de saída do rsync) e `rsync_output` (primeira linha do erro do rsync). - - Exemplo: + - Exemplo de erro de rsync: ```json { @@ -181,22 +217,25 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. "rsync_output": "@ERROR: Unknown module 'foo'", "path": "/foo/", "success": false, - "timestamp": "2025-07-29T14:00:00-03:00" + "timestamp": "2025-08-01T14:00:00-03:00" } ``` +- **Migração de endpoints:** Os endpoints `/status/*` foram movidos para `/modules/*` e agora retornam redirecionamento 301 - **Variáveis de ambiente:** - - `RSYNC_URL`: endereço base do servidor rsync (padrão: sagres.c3sl.ufpr.br) - - `POLLING_INTERVAL_SECONDS`: intervalo entre verificações (padrão: 300) + - `RSYNC_URL`: endereço base do servidor rsync (padrão: rsync://sagres.c3sl.ufpr.br/) + - `POLLING_INTERVAL_SECONDS`: intervalo entre verificações em segundos (padrão: 300) - `PORT`: porta do servidor HTTP (padrão: 8080) - **Segurança:** - - O servidor valida todos os nomes de módulo recebidos na URL para evitar ataques de path traversal e injeção. + - O servidor valida todos os nomes de módulo recebidos na URL para evitar ataques de path traversal e injeção + - Validação de métodos HTTP por endpoint + - Respostas padronizadas em JSON com códigos de status apropriados ## 🐋 Rodando em um Container (Docker): ***Construir a imagem:*** ```sh -docker build -t rsyncuptime . +docker build -f Containerfile -t rsyncuptime . ``` ***Rodar o container:*** @@ -206,3 +245,15 @@ docker run -p 8080:8080 rsyncuptime ### A aplicação estará disponível em: ***http://localhost:8080*** + +Para testar os endpoints: +```sh +# Listar módulos disponíveis +curl http://localhost:8080/modules + +# Verificar status de um módulo específico +curl http://localhost:8080/modules/debian + +# Ver histórico de um módulo +curl http://localhost:8080/modules/debian/history +``` View it on GitLab: https://gitlab.c3sl.ufpr.br/root/cli/mirror-monitor/-/compare/96b47d68e5c722... -- View it on GitLab: https://gitlab.c3sl.ufpr.br/root/cli/mirror-monitor/-/compare/96b47d68e5c722... You're receiving this email because of your account on gitlab.c3sl.ufpr.br.