raijin-server 0.2.0__tar.gz → 0.2.1__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.0/src/raijin_server.egg-info → raijin_server-0.2.1}/PKG-INFO +1 -1
  2. {raijin_server-0.2.0 → raijin_server-0.2.1}/setup.cfg +1 -1
  3. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/__init__.py +1 -1
  4. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/cli.py +18 -1
  5. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/validators.py +38 -4
  6. {raijin_server-0.2.0 → raijin_server-0.2.1/src/raijin_server.egg-info}/PKG-INFO +1 -1
  7. {raijin_server-0.2.0 → raijin_server-0.2.1}/LICENSE +0 -0
  8. {raijin_server-0.2.0 → raijin_server-0.2.1}/README.md +0 -0
  9. {raijin_server-0.2.0 → raijin_server-0.2.1}/pyproject.toml +0 -0
  10. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/config.py +0 -0
  11. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/healthchecks.py +0 -0
  12. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/__init__.py +0 -0
  13. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/apokolips_demo.py +0 -0
  14. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/bootstrap.py +0 -0
  15. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/calico.py +0 -0
  16. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/cert_manager.py +0 -0
  17. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/essentials.py +0 -0
  18. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/firewall.py +0 -0
  19. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/full_install.py +0 -0
  20. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/grafana.py +0 -0
  21. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/hardening.py +0 -0
  22. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/harness.py +0 -0
  23. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/istio.py +0 -0
  24. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/kafka.py +0 -0
  25. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/kong.py +0 -0
  26. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/kubernetes.py +0 -0
  27. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/loki.py +0 -0
  28. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/minio.py +0 -0
  29. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/network.py +0 -0
  30. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/observability_dashboards.py +0 -0
  31. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/observability_ingress.py +0 -0
  32. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/prometheus.py +0 -0
  33. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/sanitize.py +0 -0
  34. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/secrets.py +0 -0
  35. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/ssh_hardening.py +0 -0
  36. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/traefik.py +0 -0
  37. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/velero.py +0 -0
  38. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/vpn.py +0 -0
  39. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/__init__.py +0 -0
  40. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/checklist.sh +0 -0
  41. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/install.sh +0 -0
  42. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/log_size_metric.sh +0 -0
  43. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/pre-deploy-check.sh +0 -0
  44. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/utils.py +0 -0
  45. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/SOURCES.txt +0 -0
  46. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/dependency_links.txt +0 -0
  47. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/entry_points.txt +0 -0
  48. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/requires.txt +0 -0
  49. {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/top_level.txt +0 -0
  50. {raijin_server-0.2.0 → raijin_server-0.2.1}/tests/test_full_install_sequence.py +0 -0
  51. {raijin_server-0.2.0 → raijin_server-0.2.1}/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.0
3
+ Version: 0.2.1
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
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = raijin-server
3
- version = 0.2.0
3
+ version = 0.2.1
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
@@ -1,5 +1,5 @@
1
1
  """Pacote principal do CLI Raijin Server."""
2
2
 
3
- __version__ = "0.2.0"
3
+ __version__ = "0.2.1"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -265,6 +265,14 @@ def _render_menu(dry_run: bool) -> int:
265
265
  return exit_idx
266
266
 
267
267
 
268
+ def _version_callback(value: bool) -> None:
269
+ """Imprime a versao e encerra imediatamente."""
270
+
271
+ if value:
272
+ typer.echo(f"raijin-server {__version__}")
273
+ raise typer.Exit()
274
+
275
+
268
276
  def interactive_menu(ctx: typer.Context) -> None:
269
277
  exec_ctx = ctx.obj or ExecutionContext()
270
278
  current_dry_run = exec_ctx.dry_run
@@ -315,6 +323,15 @@ def main(
315
323
  module: Optional[str] = typer.Option(None, "-m", "--module", help="Modulo a executar"),
316
324
  dry_run: bool = typer.Option(False, "-n", "--dry-run", help="Mostra comandos sem executa-los."),
317
325
  skip_validation: bool = typer.Option(False, "--skip-validation", help="Pula validacoes de pre-requisitos"),
326
+ skip_root: bool = typer.Option(False, "--skip-root", help="Permite validar sem exigir root (nao recomendado)"),
327
+ version: Optional[bool] = typer.Option(
328
+ None,
329
+ "--version",
330
+ "-V",
331
+ is_eager=True,
332
+ callback=_version_callback,
333
+ help="Mostra a versao do CLI e sai",
334
+ ),
318
335
  ) -> None:
319
336
  """Mostra um menu simples quando nenhum subcomando e informado."""
320
337
 
@@ -322,7 +339,7 @@ def main(
322
339
 
323
340
  # Executa validacoes de pre-requisitos
324
341
  if not skip_validation and not dry_run:
325
- if not validate_system_requirements(ctx.obj, skip_root=False):
342
+ if not validate_system_requirements(ctx.obj, skip_root=skip_root):
326
343
  typer.secho("\nAbortando devido a pre-requisitos nao atendidos.", fg=typer.colors.RED)
327
344
  typer.echo("Use --skip-validation para pular validacoes (nao recomendado).")
328
345
  raise typer.Exit(code=1)
@@ -6,6 +6,8 @@ import os
6
6
  import platform
7
7
  import shutil
8
8
  import subprocess
9
+ import sys
10
+ import urllib.request
9
11
  from pathlib import Path
10
12
  from typing import List, Tuple
11
13
 
@@ -77,10 +79,11 @@ def check_memory(min_gb: int = 4) -> Tuple[bool, str]:
77
79
 
78
80
 
79
81
  def check_connectivity(hosts: List[str] | None = None) -> Tuple[bool, str]:
80
- """Verifica conectividade com internet."""
82
+ """Verifica conectividade com internet via ICMP e HTTP."""
81
83
  if hosts is None:
82
84
  hosts = ["8.8.8.8", "1.1.1.1"]
83
85
 
86
+ # Primeiro tenta ICMP
84
87
  for host in hosts:
85
88
  try:
86
89
  result = subprocess.run(
@@ -93,7 +96,13 @@ def check_connectivity(hosts: List[str] | None = None) -> Tuple[bool, str]:
93
96
  except Exception:
94
97
  continue
95
98
 
96
- return False, "Sem conectividade com internet"
99
+ # Fallback HTTP (caso ICMP seja bloqueado)
100
+ try:
101
+ req = urllib.request.Request("https://www.google.com", method="HEAD")
102
+ with urllib.request.urlopen(req, timeout=5):
103
+ return True, "Conectividade HTTP OK (https://www.google.com)"
104
+ except Exception:
105
+ return False, "Sem conectividade com internet (ICMP e HTTP falharam)"
97
106
 
98
107
 
99
108
  def check_required_commands(commands: List[str] | None = None) -> Tuple[bool, List[str]]:
@@ -111,11 +120,34 @@ def check_required_commands(commands: List[str] | None = None) -> Tuple[bool, Li
111
120
  return True, []
112
121
 
113
122
 
123
+ def check_virtualenv() -> Tuple[bool, str]:
124
+ """Valida se a execucao esta dentro de um ambiente isolado (venv/pyenv)."""
125
+
126
+ in_venv = sys.prefix != sys.base_prefix or os.environ.get("VIRTUAL_ENV")
127
+ externally_managed = Path(sys.prefix).joinpath("../EXTERNALLY-MANAGED").resolve()
128
+
129
+ if in_venv:
130
+ return True, "Executando em ambiente virtual"
131
+
132
+ if externally_managed.exists():
133
+ return False, (
134
+ "Python gerenciado pelo sistema. Crie um venv: "
135
+ "python3 -m venv .venv && source .venv/bin/activate && pip install -U pip setuptools && "
136
+ "pip install raijin-server"
137
+ )
138
+
139
+ return False, (
140
+ "Execucao fora de venv detectada. Crie um venv: "
141
+ "python3 -m venv .venv && source .venv/bin/activate && pip install -U pip setuptools && "
142
+ "pip install raijin-server"
143
+ )
144
+
145
+
114
146
  def check_is_root() -> Tuple[bool, str]:
115
147
  """Verifica se esta executando como root."""
116
148
  if os.geteuid() == 0:
117
149
  return True, "Executando como root"
118
- return False, "Usuario nao e root (use sudo)"
150
+ return False, "Usuario nao e root (reexecute com: sudo -E raijin-server ...)"
119
151
 
120
152
 
121
153
  def validate_system_requirements(ctx: ExecutionContext, skip_root: bool = False) -> bool:
@@ -128,6 +160,7 @@ def validate_system_requirements(ctx: ExecutionContext, skip_root: bool = False)
128
160
  typer.secho("\n=== Validacao de Pre-requisitos ===", fg=typer.colors.CYAN, bold=True)
129
161
 
130
162
  checks = [
163
+ ("Ambiente Python", check_virtualenv()),
131
164
  ("Sistema Operacional", check_os_version()),
132
165
  ("Espaco em Disco", check_disk_space()),
133
166
  ("Memoria RAM", check_memory()),
@@ -142,7 +175,8 @@ def validate_system_requirements(ctx: ExecutionContext, skip_root: bool = False)
142
175
  if cmd_ok:
143
176
  checks.append(("Comandos Essenciais", (True, "Todos os comandos disponiveis")))
144
177
  else:
145
- checks.append(("Comandos Essenciais", (False, f"Faltando: {', '.join(missing)}")))
178
+ install_hint = "sudo apt-get update && sudo apt-get install -y " + " ".join(missing)
179
+ checks.append(("Comandos Essenciais", (False, f"Faltando: {', '.join(missing)} | Sugestao: {install_hint}")))
146
180
 
147
181
  all_passed = True
148
182
  for name, (passed, message) in checks:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.0
3
+ Version: 0.2.1
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
File without changes
File without changes