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