1
|
1
|
|
2
|
2
|
# Rsync Uptime Monitor
|
3
|
3
|
|
4
|
|
-
|
|
4
|
+
|
5
|
5
|
|
6
|
6
|
Serviço web em Go para monitorar módulos de um servidor `rsync`, com interface TUI para visualização do histórico.
|
7
|
7
|
|
... |
... |
@@ -25,19 +25,19 @@ Serviço web em Go para monitorar módulos de um servidor `rsync`, com interface |
25
|
25
|
**Servidor:**
|
26
|
26
|
|
27
|
27
|
```sh
|
28
|
|
-go run server.go
|
|
28
|
+go run cmd/api/main.go
|
29
|
29
|
```
|
30
|
30
|
|
31
|
31
|
Por padrão, o servidor roda na porta 8080. Para customizar variáveis de ambiente:
|
32
|
32
|
|
33
|
33
|
```sh
|
34
|
|
-RSYNC_URL="rsync://sagres.c3sl.ufpr.br/" POLLING_INTERVAL_SECONDS=60 PORT=9090 go run server.go
|
|
34
|
+RSYNC_URL="rsync://sagres.c3sl.ufpr.br/" POLLING_INTERVAL_SECONDS=60 PORT=9090 go run cmd/api/main.go
|
35
|
35
|
```
|
36
|
36
|
|
37
|
37
|
**Cliente TUI:**
|
38
|
38
|
|
39
|
39
|
```sh
|
40
|
|
-go run tui.go
|
|
40
|
+go run cmd/tui/main.go
|
41
|
41
|
```
|
42
|
42
|
|
43
|
43
|
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 |
49
|
49
|
1. Compile o binário:
|
50
|
50
|
|
51
|
51
|
```sh
|
52
|
|
- go build -o server server.go
|
|
52
|
+ go build -o api cmd/api/main.go
|
53
|
53
|
```
|
54
|
54
|
|
55
|
|
-2. Edite o arquivo `rsyncuptime.service` conforme seu ambiente:
|
|
55
|
+2. Edite o arquivo `deploy/rsyncuptime.service` conforme seu ambiente:
|
56
|
56
|
- `WorkingDirectory`: diretório do binário
|
57
|
57
|
- `ExecStart`: caminho do binário
|
58
|
58
|
- 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 |
67
|
67
|
[Service]
|
68
|
68
|
Type=simple
|
69
|
69
|
WorkingDirectory=/caminho/do/projeto
|
70
|
|
- ExecStart=/caminho/do/projeto/server
|
|
70
|
+ ExecStart=/caminho/do/projeto/api
|
71
|
71
|
Restart=on-failure
|
72
|
72
|
RestartSec=5
|
73
|
73
|
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 |
81
|
81
|
3. Instale e ative o serviço:
|
82
|
82
|
|
83
|
83
|
```sh
|
84
|
|
- sudo cp rsyncuptime.service /etc/systemd/system/rsyncuptime.service
|
|
84
|
+ sudo cp deploy/rsyncuptime.service /etc/systemd/system/rsyncuptime.service
|
85
|
85
|
sudo systemctl daemon-reload
|
86
|
86
|
sudo systemctl enable rsyncuptime
|
87
|
87
|
sudo systemctl start rsyncuptime
|
... |
... |
@@ -95,7 +95,7 @@ No cliente TUI, use `DEBUG=1` para ativar logs detalhados em arquivo (`tui-debug |
95
|
95
|
Execute:
|
96
|
96
|
|
97
|
97
|
```sh
|
98
|
|
-go test -v
|
|
98
|
+go test -v cmd/api/
|
99
|
99
|
```
|
100
|
100
|
|
101
|
101
|
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. |
104
|
104
|
|
105
|
105
|
## Exemplos de uso da API
|
106
|
106
|
|
107
|
|
-### GET /
|
|
107
|
+### GET /modules
|
108
|
108
|
|
109
|
109
|
```json
|
110
|
110
|
{
|
111
|
|
- "message": "Monitoring all discovered modwules. See endpoints below.",
|
112
|
|
- "monitored_modules": {
|
113
|
|
- "debian": "/status/debian",
|
114
|
|
- "ubuntu": "/status/ubuntu"
|
115
|
|
- },
|
116
|
|
- "path": "/",
|
117
|
|
- "polling_interval_s": 300,
|
118
|
|
- "rsync_directories": ["debian", "ubuntu"],
|
119
|
|
- "success": true
|
|
111
|
+ "modules": [
|
|
112
|
+ "debian",
|
|
113
|
+ "debian-cd",
|
|
114
|
+ "debian-volatile",
|
|
115
|
+ "debian-security",
|
|
116
|
+ "debian-multimedia",
|
|
117
|
+ "debian-backports",
|
|
118
|
+ "aptosid",
|
|
119
|
+ "turnkeylinux",
|
|
120
|
+ "ubuntu",
|
|
121
|
+ "releases",
|
|
122
|
+ "archlinux",
|
|
123
|
+ "fedora",
|
|
124
|
+ "gentoo",
|
|
125
|
+ "mint"
|
|
126
|
+ ],
|
|
127
|
+ "polling_interval_s": 300
|
120
|
128
|
}
|
121
|
129
|
```
|
122
|
130
|
|
123
|
|
-### GET /status/debian (sucesso)
|
|
131
|
+### GET /modules/debian (status atual)
|
|
132
|
+
|
|
133
|
+```json
|
|
134
|
+{
|
|
135
|
+ "is_up": true,
|
|
136
|
+ "message": "Operational",
|
|
137
|
+ "http_status": 200,
|
|
138
|
+ "timestamp": "2025-08-01T14:54:53.280362792-03:00"
|
|
139
|
+}
|
|
140
|
+```
|
|
141
|
+
|
|
142
|
+### GET /modules/debian/history (histórico completo)
|
124
|
143
|
|
125
|
144
|
```json
|
126
|
145
|
[
|
... |
... |
@@ -131,18 +150,29 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. |
131
|
150
|
"message": "Operational",
|
132
|
151
|
"path": "/debian/",
|
133
|
152
|
"success": true,
|
134
|
|
- "timestamp": "2025-07-29T13:59:01.433848536-03:00"
|
|
153
|
+ "timestamp": "2025-08-01T14:54:53.280362792-03:00"
|
135
|
154
|
}
|
136
|
155
|
]
|
137
|
156
|
```
|
138
|
157
|
|
139
|
|
-### GET /status/nonexistent (erro)
|
|
158
|
+### GET /modules/nonexistent (módulo não encontrado)
|
140
|
159
|
|
141
|
160
|
```json
|
142
|
161
|
{
|
143
|
162
|
"code": 404,
|
144
|
|
- "error": "Module 'nonexistent' is not monitored.",
|
145
|
|
- "path": "/status/nonexistent",
|
|
163
|
+ "error": "Module 'nonexistent' not found",
|
|
164
|
+ "path": "/modules/nonexistent",
|
|
165
|
+ "success": false
|
|
166
|
+}
|
|
167
|
+```
|
|
168
|
+
|
|
169
|
+### GET /modules/test@invalid (nome inválido)
|
|
170
|
+
|
|
171
|
+```json
|
|
172
|
+{
|
|
173
|
+ "code": 400,
|
|
174
|
+ "error": "Invalid module name: 'test@invalid'",
|
|
175
|
+ "path": "/modules/test@invalid",
|
146
|
176
|
"success": false
|
147
|
177
|
}
|
148
|
178
|
```
|
... |
... |
@@ -151,14 +181,18 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. |
151
|
181
|
|
152
|
182
|
## Endpoints principais
|
153
|
183
|
|
154
|
|
-- `GET /` — Lista módulos monitorados e informações gerais
|
155
|
|
-- `GET /status/<modulo>` — Histórico de status do módulo
|
|
184
|
+- `GET /modules` — Lista todos os módulos monitorados e informações gerais
|
|
185
|
+- `GET /modules/{modulo}` — Status atual do módulo específico
|
|
186
|
+- `GET /modules/{modulo}/history` — Histórico completo de status do módulo
|
|
187
|
+- `GET /status/{modulo}` — **[DEPRECATED]** Redireciona para `/modules/{modulo}` (301 Moved Permanently)
|
156
|
188
|
|
157
|
189
|
**Códigos de resposta:**
|
158
|
190
|
|
159
|
191
|
- 200 OK: módulo operacional
|
160
|
|
-- 400 Bad Request: nome inválido
|
|
192
|
+- 301 Moved Permanently: endpoint `/status/` foi movido para `/modules/`
|
|
193
|
+- 400 Bad Request: nome de módulo inválido ou requisição malformada
|
161
|
194
|
- 404 Not Found: módulo não existe ou não está sendo monitorado
|
|
195
|
+- 405 Method Not Allowed: método HTTP não permitido para o endpoint
|
162
|
196
|
- 500 Internal Server Error: erro interno do rsync
|
163
|
197
|
|
164
|
198
|
---
|
... |
... |
@@ -169,8 +203,10 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. |
169
|
203
|
- **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.
|
170
|
204
|
- **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`.
|
171
|
205
|
- **Campos de erro e resposta:**
|
|
206
|
+ - **Status atual** (`/modules/{modulo}`): Retorna apenas o último resultado da verificação
|
|
207
|
+ - **Histórico completo** (`/modules/{modulo}/history`): Retorna array com todo o histórico armazenado
|
172
|
208
|
- 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).
|
173
|
|
- - Exemplo:
|
|
209
|
+ - Exemplo de erro de rsync:
|
174
|
210
|
|
175
|
211
|
```json
|
176
|
212
|
{
|
... |
... |
@@ -181,22 +217,25 @@ Os testes cobrem validação, respostas HTTP e cenários de erro do rsync. |
181
|
217
|
"rsync_output": "@ERROR: Unknown module 'foo'",
|
182
|
218
|
"path": "/foo/",
|
183
|
219
|
"success": false,
|
184
|
|
- "timestamp": "2025-07-29T14:00:00-03:00"
|
|
220
|
+ "timestamp": "2025-08-01T14:00:00-03:00"
|
185
|
221
|
}
|
186
|
222
|
```
|
187
|
223
|
|
|
224
|
+- **Migração de endpoints:** Os endpoints `/status/*` foram movidos para `/modules/*` e agora retornam redirecionamento 301
|
188
|
225
|
- **Variáveis de ambiente:**
|
189
|
|
- - `RSYNC_URL`: endereço base do servidor rsync (padrão: sagres.c3sl.ufpr.br)
|
190
|
|
- - `POLLING_INTERVAL_SECONDS`: intervalo entre verificações (padrão: 300)
|
|
226
|
+ - `RSYNC_URL`: endereço base do servidor rsync (padrão: rsync://sagres.c3sl.ufpr.br/)
|
|
227
|
+ - `POLLING_INTERVAL_SECONDS`: intervalo entre verificações em segundos (padrão: 300)
|
191
|
228
|
- `PORT`: porta do servidor HTTP (padrão: 8080)
|
192
|
229
|
- **Segurança:**
|
193
|
|
- - O servidor valida todos os nomes de módulo recebidos na URL para evitar ataques de path traversal e injeção.
|
|
230
|
+ - O servidor valida todos os nomes de módulo recebidos na URL para evitar ataques de path traversal e injeção
|
|
231
|
+ - Validação de métodos HTTP por endpoint
|
|
232
|
+ - Respostas padronizadas em JSON com códigos de status apropriados
|
194
|
233
|
|
195
|
234
|
## 🐋 Rodando em um Container (Docker):
|
196
|
235
|
|
197
|
236
|
***Construir a imagem:***
|
198
|
237
|
```sh
|
199
|
|
-docker build -t rsyncuptime .
|
|
238
|
+docker build -f Containerfile -t rsyncuptime .
|
200
|
239
|
```
|
201
|
240
|
|
202
|
241
|
***Rodar o container:***
|
... |
... |
@@ -206,3 +245,15 @@ docker run -p 8080:8080 rsyncuptime |
206
|
245
|
|
207
|
246
|
### A aplicação estará disponível em:
|
208
|
247
|
***http://localhost:8080***
|
|
248
|
+
|
|
249
|
+Para testar os endpoints:
|
|
250
|
+```sh
|
|
251
|
+# Listar módulos disponíveis
|
|
252
|
+curl http://localhost:8080/modules
|
|
253
|
+
|
|
254
|
+# Verificar status de um módulo específico
|
|
255
|
+curl http://localhost:8080/modules/debian
|
|
256
|
+
|
|
257
|
+# Ver histórico de um módulo
|
|
258
|
+curl http://localhost:8080/modules/debian/history
|
|
259
|
+``` |