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.
- {raijin_server-0.2.0/src/raijin_server.egg-info → raijin_server-0.2.1}/PKG-INFO +1 -1
- {raijin_server-0.2.0 → raijin_server-0.2.1}/setup.cfg +1 -1
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/__init__.py +1 -1
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/cli.py +18 -1
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/validators.py +38 -4
- {raijin_server-0.2.0 → raijin_server-0.2.1/src/raijin_server.egg-info}/PKG-INFO +1 -1
- {raijin_server-0.2.0 → raijin_server-0.2.1}/LICENSE +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/README.md +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/pyproject.toml +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/config.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/healthchecks.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/__init__.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/apokolips_demo.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/bootstrap.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/calico.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/cert_manager.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/essentials.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/firewall.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/full_install.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/grafana.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/hardening.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/harness.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/istio.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/kafka.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/kong.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/kubernetes.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/loki.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/minio.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/network.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/observability_dashboards.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/observability_ingress.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/prometheus.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/sanitize.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/secrets.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/ssh_hardening.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/traefik.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/velero.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/vpn.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/__init__.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/checklist.sh +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/install.sh +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/log_size_metric.sh +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/scripts/pre-deploy-check.sh +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/utils.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/SOURCES.txt +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/dependency_links.txt +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/entry_points.txt +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/requires.txt +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server.egg-info/top_level.txt +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/tests/test_full_install_sequence.py +0 -0
- {raijin_server-0.2.0 → raijin_server-0.2.1}/tests/test_registry.py +0 -0
|
@@ -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=
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/observability_dashboards.py
RENAMED
|
File without changes
|
{raijin_server-0.2.0 → raijin_server-0.2.1}/src/raijin_server/modules/observability_ingress.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|