raijin-server 0.2.4__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {raijin_server-0.2.4/src/raijin_server.egg-info → raijin_server-0.2.5}/PKG-INFO +35 -1
  2. {raijin_server-0.2.4 → raijin_server-0.2.5}/README.md +34 -0
  3. {raijin_server-0.2.4 → raijin_server-0.2.5}/setup.cfg +1 -1
  4. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/cert_manager.py +1 -0
  5. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/utils.py +79 -2
  6. {raijin_server-0.2.4 → raijin_server-0.2.5/src/raijin_server.egg-info}/PKG-INFO +35 -1
  7. {raijin_server-0.2.4 → raijin_server-0.2.5}/LICENSE +0 -0
  8. {raijin_server-0.2.4 → raijin_server-0.2.5}/pyproject.toml +0 -0
  9. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/__init__.py +0 -0
  10. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/cli.py +0 -0
  11. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/config.py +0 -0
  12. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/healthchecks.py +0 -0
  13. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/__init__.py +0 -0
  14. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/apokolips_demo.py +0 -0
  15. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/bootstrap.py +0 -0
  16. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/calico.py +0 -0
  17. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/essentials.py +0 -0
  18. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/firewall.py +0 -0
  19. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/full_install.py +0 -0
  20. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/grafana.py +0 -0
  21. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/hardening.py +0 -0
  22. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/harness.py +0 -0
  23. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/istio.py +0 -0
  24. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/kafka.py +0 -0
  25. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/kong.py +0 -0
  26. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/kubernetes.py +0 -0
  27. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/loki.py +0 -0
  28. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/minio.py +0 -0
  29. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/network.py +0 -0
  30. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/observability_dashboards.py +0 -0
  31. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/observability_ingress.py +0 -0
  32. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/prometheus.py +0 -0
  33. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/sanitize.py +0 -0
  34. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/secrets.py +0 -0
  35. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/ssh_hardening.py +0 -0
  36. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/traefik.py +0 -0
  37. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/velero.py +0 -0
  38. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/modules/vpn.py +0 -0
  39. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/scripts/__init__.py +0 -0
  40. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/scripts/checklist.sh +0 -0
  41. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/scripts/install.sh +0 -0
  42. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/scripts/log_size_metric.sh +0 -0
  43. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/scripts/pre-deploy-check.sh +0 -0
  44. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server/validators.py +0 -0
  45. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server.egg-info/SOURCES.txt +0 -0
  46. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server.egg-info/dependency_links.txt +0 -0
  47. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server.egg-info/entry_points.txt +0 -0
  48. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server.egg-info/requires.txt +0 -0
  49. {raijin_server-0.2.4 → raijin_server-0.2.5}/src/raijin_server.egg-info/top_level.txt +0 -0
  50. {raijin_server-0.2.4 → raijin_server-0.2.5}/tests/test_full_install_sequence.py +0 -0
  51. {raijin_server-0.2.4 → raijin_server-0.2.5}/tests/test_registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
5
  Home-page: https://example.com/raijin-server
6
6
  Author: Equipe Raijin
@@ -37,6 +37,14 @@ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Se
37
37
 
38
38
  **✨ Versão Auditada e Resiliente para Produção**
39
39
 
40
+ ## Links úteis
41
+
42
+ - Repositório: https://github.com/rafaelluisdacostacoelho/raijin-server
43
+ - Documentação completa: [docs/INFRASTRUCTURE_GUIDE.md](docs/INFRASTRUCTURE_GUIDE.md)
44
+ - Arquitetura: [ARCHITECTURE.md](ARCHITECTURE.md)
45
+ - Auditoria: [AUDIT.md](AUDIT.md)
46
+ - Segurança: [SECURITY.md](SECURITY.md)
47
+
40
48
  ## Destaques
41
49
 
42
50
  - ✅ **Validações de Pré-requisitos**: OS, espaço em disco, memória, conectividade, ambiente Python (venv)
@@ -405,6 +413,32 @@ pytest
405
413
  ruff check src tests
406
414
  ```
407
415
 
416
+ ## Publicar no PyPI (Twine)
417
+
418
+ O Twine é a ferramenta oficial para enviar pacotes Python ao PyPI com upload seguro (HTTPS e checagem de hash). Use sempre um token de API.
419
+
420
+ Passo a passo:
421
+ ```bash
422
+ # 1) Gere artefatos
423
+ python -m build --sdist --wheel --outdir dist/
424
+
425
+ # 2) Configure o token (crie em https://pypi.org/manage/account/token/)
426
+ export TWINE_USERNAME=__token__
427
+ export TWINE_PASSWORD="<seu-token>"
428
+
429
+ # 3) Envie para o PyPI
430
+ python -m twine upload dist/*
431
+
432
+ # 4) Verifique instalação
433
+ python -m pip install -U raijin-server
434
+ raijin-server --version
435
+ ```
436
+
437
+ Boas práticas:
438
+ - Use venv dedicado para publicar (`python -m venv ~/.venvs/publish && source ~/.venvs/publish/bin/activate`).
439
+ - Nunca commite ou exponha o token; mantenha em variável de ambiente/secret manager.
440
+ - Sempre suba primeiro para TestPyPI se quiser validar (`--repository testpypi`).
441
+
408
442
  ## Acesso remoto seguro (VPN + SSH)
409
443
 
410
444
  Execute `raijin-server ssh-hardening` para aplicar as politicas abaixo automaticamente e `raijin-server vpn` para subir o servidor WireGuard com um cliente inicial. Use `--dry-run` se quiser apenas revisar os comandos.
@@ -4,6 +4,14 @@ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Se
4
4
 
5
5
  **✨ Versão Auditada e Resiliente para Produção**
6
6
 
7
+ ## Links úteis
8
+
9
+ - Repositório: https://github.com/rafaelluisdacostacoelho/raijin-server
10
+ - Documentação completa: [docs/INFRASTRUCTURE_GUIDE.md](docs/INFRASTRUCTURE_GUIDE.md)
11
+ - Arquitetura: [ARCHITECTURE.md](ARCHITECTURE.md)
12
+ - Auditoria: [AUDIT.md](AUDIT.md)
13
+ - Segurança: [SECURITY.md](SECURITY.md)
14
+
7
15
  ## Destaques
8
16
 
9
17
  - ✅ **Validações de Pré-requisitos**: OS, espaço em disco, memória, conectividade, ambiente Python (venv)
@@ -372,6 +380,32 @@ pytest
372
380
  ruff check src tests
373
381
  ```
374
382
 
383
+ ## Publicar no PyPI (Twine)
384
+
385
+ O Twine é a ferramenta oficial para enviar pacotes Python ao PyPI com upload seguro (HTTPS e checagem de hash). Use sempre um token de API.
386
+
387
+ Passo a passo:
388
+ ```bash
389
+ # 1) Gere artefatos
390
+ python -m build --sdist --wheel --outdir dist/
391
+
392
+ # 2) Configure o token (crie em https://pypi.org/manage/account/token/)
393
+ export TWINE_USERNAME=__token__
394
+ export TWINE_PASSWORD="<seu-token>"
395
+
396
+ # 3) Envie para o PyPI
397
+ python -m twine upload dist/*
398
+
399
+ # 4) Verifique instalação
400
+ python -m pip install -U raijin-server
401
+ raijin-server --version
402
+ ```
403
+
404
+ Boas práticas:
405
+ - Use venv dedicado para publicar (`python -m venv ~/.venvs/publish && source ~/.venvs/publish/bin/activate`).
406
+ - Nunca commite ou exponha o token; mantenha em variável de ambiente/secret manager.
407
+ - Sempre suba primeiro para TestPyPI se quiser validar (`--repository testpypi`).
408
+
375
409
  ## Acesso remoto seguro (VPN + SSH)
376
410
 
377
411
  Execute `raijin-server ssh-hardening` para aplicar as politicas abaixo automaticamente e `raijin-server vpn` para subir o servidor WireGuard com um cliente inicial. Use `--dry-run` se quiser apenas revisar os comandos.
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = raijin-server
3
- version = 0.2.4
3
+ version = 0.2.5
4
4
  description = CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -437,6 +437,7 @@ def _install_cert_manager_helm(ctx: ExecutionContext) -> bool:
437
437
  typer.secho("\n📦 Instalando cert-manager via Helm...", fg=typer.colors.CYAN, bold=True)
438
438
 
439
439
  try:
440
+ # O helm_upgrade_install agora limpa releases pendentes automaticamente
440
441
  helm_upgrade_install(
441
442
  release="cert-manager",
442
443
  chart=CHART_NAME,
@@ -299,6 +299,62 @@ def helm_repo_update(ctx: ExecutionContext) -> None:
299
299
  run_cmd(["helm", "repo", "update"], ctx)
300
300
 
301
301
 
302
+ def _get_helm_release_status(release: str, namespace: str) -> str:
303
+ """Retorna status do release Helm (lowercased) ou string vazia se nao existir."""
304
+ try:
305
+ import json
306
+ result = subprocess.run(
307
+ ["helm", "status", release, "-n", namespace, "-o", "json"],
308
+ capture_output=True,
309
+ text=True,
310
+ timeout=30,
311
+ )
312
+ if result.returncode != 0 or not result.stdout:
313
+ return ""
314
+ data = json.loads(result.stdout)
315
+ return str(data.get("info", {}).get("status", "")).lower()
316
+ except Exception:
317
+ return ""
318
+
319
+
320
+ def _cleanup_pending_helm_release(release: str, namespace: str, ctx: ExecutionContext) -> None:
321
+ """Remove release Helm em estado pendente que bloqueia novas operacoes."""
322
+ if ctx.dry_run:
323
+ return
324
+
325
+ status = _get_helm_release_status(release, namespace)
326
+ if not status:
327
+ return
328
+
329
+ # Estados que bloqueiam: pending-install, pending-upgrade, pending-rollback
330
+ if status.startswith("pending"):
331
+ typer.secho(
332
+ f"⚠ Release '{release}' em estado '{status}'. Limpando antes de prosseguir...",
333
+ fg=typer.colors.YELLOW,
334
+ )
335
+ # Tenta rollback primeiro (funciona para pending-upgrade)
336
+ subprocess.run(
337
+ ["helm", "rollback", release, "-n", namespace, "--wait", "--timeout", "2m"],
338
+ capture_output=True,
339
+ timeout=150,
340
+ )
341
+ # Verifica se resolveu
342
+ new_status = _get_helm_release_status(release, namespace)
343
+ if new_status.startswith("pending"):
344
+ # Se ainda pendente, desinstala
345
+ typer.secho(
346
+ f" Rollback nao resolveu. Desinstalando release '{release}'...",
347
+ fg=typer.colors.YELLOW,
348
+ )
349
+ subprocess.run(
350
+ ["helm", "uninstall", release, "-n", namespace, "--wait", "--timeout", "3m"],
351
+ capture_output=True,
352
+ timeout=200,
353
+ )
354
+ time.sleep(5)
355
+ typer.secho(f"✓ Release '{release}' limpo.", fg=typer.colors.GREEN)
356
+
357
+
302
358
  def helm_upgrade_install(
303
359
  release: str,
304
360
  chart: str,
@@ -311,9 +367,16 @@ def helm_upgrade_install(
311
367
  create_namespace: bool = True,
312
368
  extra_args: list[str] | None = None,
313
369
  ) -> None:
314
- """Executa helm upgrade --install com opcoes comuns."""
370
+ """Executa helm upgrade --install com opcoes comuns.
371
+
372
+ Automaticamente detecta e limpa releases em estado pendente antes de instalar.
373
+ """
315
374
 
316
375
  ensure_tool("helm", ctx, install_hint="Instale helm ou habilite dry-run para so visualizar.")
376
+
377
+ # Limpa releases pendentes antes de tentar instalar
378
+ _cleanup_pending_helm_release(release, namespace, ctx)
379
+
317
380
  if repo and repo_url:
318
381
  helm_repo_add(repo, repo_url, ctx)
319
382
  helm_repo_update(ctx)
@@ -328,7 +391,21 @@ def helm_upgrade_install(
328
391
  cmd.extend(["--set", value])
329
392
  if extra_args:
330
393
  cmd.extend(extra_args)
331
- run_cmd(cmd, ctx)
394
+
395
+ try:
396
+ run_cmd(cmd, ctx)
397
+ except Exception as e:
398
+ err_text = str(e).lower()
399
+ # Se falhou por operacao em progresso, tenta limpar e reinstalar uma vez
400
+ if "another operation" in err_text and "in progress" in err_text:
401
+ typer.secho(
402
+ f"⚠ Helm detectou operacao pendente em '{release}'. Limpando e tentando novamente...",
403
+ fg=typer.colors.YELLOW,
404
+ )
405
+ _cleanup_pending_helm_release(release, namespace, ctx)
406
+ run_cmd(cmd, ctx)
407
+ else:
408
+ raise
332
409
 
333
410
 
334
411
  def kubectl_apply(target: str, ctx: ExecutionContext) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
5
  Home-page: https://example.com/raijin-server
6
6
  Author: Equipe Raijin
@@ -37,6 +37,14 @@ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Se
37
37
 
38
38
  **✨ Versão Auditada e Resiliente para Produção**
39
39
 
40
+ ## Links úteis
41
+
42
+ - Repositório: https://github.com/rafaelluisdacostacoelho/raijin-server
43
+ - Documentação completa: [docs/INFRASTRUCTURE_GUIDE.md](docs/INFRASTRUCTURE_GUIDE.md)
44
+ - Arquitetura: [ARCHITECTURE.md](ARCHITECTURE.md)
45
+ - Auditoria: [AUDIT.md](AUDIT.md)
46
+ - Segurança: [SECURITY.md](SECURITY.md)
47
+
40
48
  ## Destaques
41
49
 
42
50
  - ✅ **Validações de Pré-requisitos**: OS, espaço em disco, memória, conectividade, ambiente Python (venv)
@@ -405,6 +413,32 @@ pytest
405
413
  ruff check src tests
406
414
  ```
407
415
 
416
+ ## Publicar no PyPI (Twine)
417
+
418
+ O Twine é a ferramenta oficial para enviar pacotes Python ao PyPI com upload seguro (HTTPS e checagem de hash). Use sempre um token de API.
419
+
420
+ Passo a passo:
421
+ ```bash
422
+ # 1) Gere artefatos
423
+ python -m build --sdist --wheel --outdir dist/
424
+
425
+ # 2) Configure o token (crie em https://pypi.org/manage/account/token/)
426
+ export TWINE_USERNAME=__token__
427
+ export TWINE_PASSWORD="<seu-token>"
428
+
429
+ # 3) Envie para o PyPI
430
+ python -m twine upload dist/*
431
+
432
+ # 4) Verifique instalação
433
+ python -m pip install -U raijin-server
434
+ raijin-server --version
435
+ ```
436
+
437
+ Boas práticas:
438
+ - Use venv dedicado para publicar (`python -m venv ~/.venvs/publish && source ~/.venvs/publish/bin/activate`).
439
+ - Nunca commite ou exponha o token; mantenha em variável de ambiente/secret manager.
440
+ - Sempre suba primeiro para TestPyPI se quiser validar (`--repository testpypi`).
441
+
408
442
  ## Acesso remoto seguro (VPN + SSH)
409
443
 
410
444
  Execute `raijin-server ssh-hardening` para aplicar as politicas abaixo automaticamente e `raijin-server vpn` para subir o servidor WireGuard com um cliente inicial. Use `--dry-run` se quiser apenas revisar os comandos.
File without changes