Heric Camargo pushed to branch main at Root / CLI / Mirror Monitor

Commits:

2 changed files:

Changes:

  • Containerfile
    ... ... @@ -6,9 +6,8 @@ WORKDIR /app
    6 6
     # Copia os arquivos do projeto
    
    7 7
     COPY . .
    
    8 8
     
    
    9
    -# Compilando o binário server.go 
    
    10
    -#Atenção: estamos colocando apenas o programa server.go no container, o tui.go continuará fora!
    
    11
    -RUN go build -o rsyncuptime server.go
    
    9
    +# Compilando o binário da API
    
    10
    +RUN go build -o rsyncuptime cmd/api/main.go
    
    12 11
     
    
    13 12
     # Etapa final:
    
    14 13
     FROM debian:bookworm-slim
    

  • README.md
    1 1
     
    
    2 2
     # Rsync Uptime Monitor
    
    3 3
     
    
    4
    -![Rsync Uptime Monitor Screenshot](./src/img.png)
    
    4
    +![Rsync Uptime Monitor Screenshot](./assets/img.png)
    
    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
    +```