raijin-server 0.2.37__tar.gz → 0.2.38__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.

Potentially problematic release.


This version of raijin-server might be problematic. Click here for more details.

Files changed (54) hide show
  1. {raijin_server-0.2.37/src/raijin_server.egg-info → raijin_server-0.2.38}/PKG-INFO +1 -1
  2. {raijin_server-0.2.37 → raijin_server-0.2.38}/setup.cfg +1 -1
  3. raijin_server-0.2.38/src/raijin_server/__init__.py +5 -0
  4. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/minio.py +148 -7
  5. {raijin_server-0.2.37 → raijin_server-0.2.38/src/raijin_server.egg-info}/PKG-INFO +1 -1
  6. raijin_server-0.2.37/src/raijin_server/__init__.py +0 -5
  7. {raijin_server-0.2.37 → raijin_server-0.2.38}/LICENSE +0 -0
  8. {raijin_server-0.2.37 → raijin_server-0.2.38}/README.md +0 -0
  9. {raijin_server-0.2.37 → raijin_server-0.2.38}/pyproject.toml +0 -0
  10. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/cli.py +0 -0
  11. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/config.py +0 -0
  12. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/healthchecks.py +0 -0
  13. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/module_manager.py +0 -0
  14. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/__init__.py +0 -0
  15. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/apokolips_demo.py +0 -0
  16. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/bootstrap.py +0 -0
  17. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/calico.py +0 -0
  18. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/cert_manager.py +0 -0
  19. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/essentials.py +0 -0
  20. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/firewall.py +0 -0
  21. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/full_install.py +0 -0
  22. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/grafana.py +0 -0
  23. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/hardening.py +0 -0
  24. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/harness.py +0 -0
  25. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/istio.py +0 -0
  26. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/kafka.py +0 -0
  27. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/kong.py +0 -0
  28. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/kubernetes.py +0 -0
  29. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/loki.py +0 -0
  30. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/metallb.py +0 -0
  31. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/network.py +0 -0
  32. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/observability_dashboards.py +0 -0
  33. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/observability_ingress.py +0 -0
  34. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/prometheus.py +0 -0
  35. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/sanitize.py +0 -0
  36. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/secrets.py +0 -0
  37. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/ssh_hardening.py +0 -0
  38. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/traefik.py +0 -0
  39. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/velero.py +0 -0
  40. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/modules/vpn.py +0 -0
  41. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/scripts/__init__.py +0 -0
  42. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/scripts/checklist.sh +0 -0
  43. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/scripts/install.sh +0 -0
  44. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/scripts/log_size_metric.sh +0 -0
  45. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/scripts/pre-deploy-check.sh +0 -0
  46. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/utils.py +0 -0
  47. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server/validators.py +0 -0
  48. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server.egg-info/SOURCES.txt +0 -0
  49. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server.egg-info/dependency_links.txt +0 -0
  50. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server.egg-info/entry_points.txt +0 -0
  51. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server.egg-info/requires.txt +0 -0
  52. {raijin_server-0.2.37 → raijin_server-0.2.38}/src/raijin_server.egg-info/top_level.txt +0 -0
  53. {raijin_server-0.2.37 → raijin_server-0.2.38}/tests/test_full_install_sequence.py +0 -0
  54. {raijin_server-0.2.37 → raijin_server-0.2.38}/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.37
3
+ Version: 0.2.38
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.37
3
+ version = 0.2.38
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
@@ -0,0 +1,5 @@
1
+ """Pacote principal do CLI Raijin Server."""
2
+
3
+ __version__ = "0.2.38"
4
+
5
+ __all__ = ["__version__"]
@@ -8,6 +8,11 @@ import typer
8
8
 
9
9
  from raijin_server.utils import ExecutionContext, helm_upgrade_install, require_root, run_cmd
10
10
 
11
+ LOCAL_PATH_PROVISIONER_URL = (
12
+ "https://raw.githubusercontent.com/rancher/local-path-provisioner/"
13
+ "v0.0.30/deploy/local-path-storage.yaml"
14
+ )
15
+
11
16
 
12
17
  def _detect_node_name(ctx: ExecutionContext) -> str:
13
18
  """Detecta nome do node para nodeSelector."""
@@ -26,6 +31,137 @@ def _generate_secret(length: int = 32) -> str:
26
31
  return secrets.token_urlsafe(length)[:length]
27
32
 
28
33
 
34
+ def _get_default_storage_class(ctx: ExecutionContext) -> str:
35
+ """Retorna o nome da StorageClass default do cluster, se existir."""
36
+ result = run_cmd(
37
+ [
38
+ "kubectl", "get", "storageclass",
39
+ "-o", "jsonpath={.items[?(@.metadata.annotations.storageclass\\.kubernetes\\.io/is-default-class=='true')].metadata.name}",
40
+ ],
41
+ ctx,
42
+ check=False,
43
+ )
44
+ if result.returncode == 0 and (result.stdout or "").strip():
45
+ return (result.stdout or "").strip()
46
+ return ""
47
+
48
+
49
+ def _list_storage_classes(ctx: ExecutionContext) -> list:
50
+ """Lista todas as StorageClasses disponiveis."""
51
+ result = run_cmd(
52
+ ["kubectl", "get", "storageclass", "-o", "jsonpath={.items[*].metadata.name}"],
53
+ ctx,
54
+ check=False,
55
+ )
56
+ if result.returncode == 0 and (result.stdout or "").strip():
57
+ return (result.stdout or "").strip().split()
58
+ return []
59
+
60
+
61
+ def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
62
+ """Instala local-path-provisioner para usar storage local (NVMe/SSD)."""
63
+ typer.echo("Instalando local-path-provisioner para storage local...")
64
+
65
+ result = run_cmd(
66
+ ["kubectl", "apply", "-f", LOCAL_PATH_PROVISIONER_URL],
67
+ ctx,
68
+ check=False,
69
+ )
70
+ if result.returncode != 0:
71
+ typer.secho(" Falha ao instalar local-path-provisioner.", fg=typer.colors.RED)
72
+ return False
73
+
74
+ # Aguarda deployment ficar pronto
75
+ typer.echo(" Aguardando local-path-provisioner ficar Ready...")
76
+ run_cmd(
77
+ [
78
+ "kubectl", "-n", "local-path-storage", "rollout", "status",
79
+ "deployment/local-path-provisioner", "--timeout=60s",
80
+ ],
81
+ ctx,
82
+ check=False,
83
+ )
84
+
85
+ typer.secho(" ✓ local-path-provisioner instalado.", fg=typer.colors.GREEN)
86
+ return True
87
+
88
+
89
+ def _set_default_storage_class(ctx: ExecutionContext, name: str) -> None:
90
+ """Define uma StorageClass como default."""
91
+ # Remove default de outras classes primeiro
92
+ existing = _list_storage_classes(ctx)
93
+ for sc in existing:
94
+ if sc != name:
95
+ run_cmd(
96
+ [
97
+ "kubectl", "annotate", "storageclass", sc,
98
+ "storageclass.kubernetes.io/is-default-class-",
99
+ "--overwrite",
100
+ ],
101
+ ctx,
102
+ check=False,
103
+ )
104
+
105
+ # Define a nova como default
106
+ run_cmd(
107
+ [
108
+ "kubectl", "annotate", "storageclass", name,
109
+ "storageclass.kubernetes.io/is-default-class=true",
110
+ "--overwrite",
111
+ ],
112
+ ctx,
113
+ check=True,
114
+ )
115
+ typer.secho(f" ✓ StorageClass '{name}' definida como default.", fg=typer.colors.GREEN)
116
+
117
+
118
+ def _ensure_storage_class(ctx: ExecutionContext) -> str:
119
+ """Garante que existe uma StorageClass disponivel, instalando local-path se necessario."""
120
+ # Verifica se ja tem default
121
+ default_sc = _get_default_storage_class(ctx)
122
+ if default_sc:
123
+ typer.echo(f"StorageClass default detectada: {default_sc}")
124
+ return default_sc
125
+
126
+ # Lista classes disponiveis
127
+ available = _list_storage_classes(ctx)
128
+ if available:
129
+ typer.echo(f"StorageClasses disponiveis (sem default): {', '.join(available)}")
130
+ # Se local-path existe, define como default
131
+ if "local-path" in available:
132
+ _set_default_storage_class(ctx, "local-path")
133
+ return "local-path"
134
+ # Pergunta qual usar
135
+ choice = typer.prompt(
136
+ f"Qual StorageClass usar? ({'/'.join(available)})",
137
+ default=available[0],
138
+ )
139
+ return choice
140
+
141
+ # Sem StorageClass - instala local-path-provisioner
142
+ typer.secho(
143
+ "Nenhuma StorageClass encontrada no cluster.",
144
+ fg=typer.colors.YELLOW,
145
+ )
146
+ install = typer.confirm(
147
+ "Instalar local-path-provisioner para usar armazenamento local (NVMe/SSD)?",
148
+ default=True,
149
+ )
150
+ if not install:
151
+ typer.secho(
152
+ "Abortando: MinIO requer uma StorageClass para PVCs.",
153
+ fg=typer.colors.RED,
154
+ )
155
+ raise typer.Exit(1)
156
+
157
+ if not _install_local_path_provisioner(ctx):
158
+ raise typer.Exit(1)
159
+
160
+ # Define como default
161
+ _set_default_storage_class(ctx, "local-path")
162
+ return "local-path"
163
+
164
+
29
165
  def _check_existing_minio(ctx: ExecutionContext) -> bool:
30
166
  """Verifica se existe instalacao do MinIO."""
31
167
  result = run_cmd(
@@ -119,6 +255,9 @@ def run(ctx: ExecutionContext) -> None:
119
255
  if cleanup:
120
256
  _uninstall_minio(ctx)
121
257
 
258
+ # Garante que existe StorageClass (instala local-path-provisioner se necessario)
259
+ storage_class = _ensure_storage_class(ctx)
260
+
122
261
  # Configuracoes interativas
123
262
  mode = typer.prompt(
124
263
  "Modo de operacao (standalone/distributed)",
@@ -165,10 +304,15 @@ def run(ctx: ExecutionContext) -> None:
165
304
  typer.secho(f" Password gerado: {root_password}", fg=typer.colors.CYAN)
166
305
 
167
306
  persistence_size = typer.prompt("Tamanho do storage (ex: 10Gi, 50Gi)", default="10Gi")
168
- storage_class = typer.prompt(
169
- "StorageClass para os PVCs (ENTER para usar o default do cluster)",
170
- default="",
307
+
308
+ # Permite override da StorageClass detectada
309
+ storage_class_override = typer.prompt(
310
+ f"StorageClass para os PVCs (detectada: {storage_class})",
311
+ default=storage_class,
171
312
  ).strip()
313
+ if storage_class_override:
314
+ storage_class = storage_class_override
315
+
172
316
  enable_console = typer.confirm("Habilitar Console Web?", default=True)
173
317
 
174
318
  node_name = _detect_node_name(ctx)
@@ -180,7 +324,7 @@ def run(ctx: ExecutionContext) -> None:
180
324
  # Persistence
181
325
  "persistence.enabled=true",
182
326
  f"persistence.size={persistence_size}",
183
- # Se o cluster tiver StorageClass padrao, deixe em branco; caso contrario, defina aqui
327
+ f"persistence.storageClass={storage_class}",
184
328
  # Resources
185
329
  f"resources.requests.memory={resources_req_mem}",
186
330
  f"resources.requests.cpu={resources_req_cpu}",
@@ -205,9 +349,6 @@ def run(ctx: ExecutionContext) -> None:
205
349
  f"postJob.nodeSelector.kubernetes\\.io/hostname={node_name}",
206
350
  ]
207
351
 
208
- if storage_class:
209
- values.append(f"persistence.storageClass={storage_class}")
210
-
211
352
  if is_distributed:
212
353
  values.append(f"replicas={replicas}")
213
354
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.37
3
+ Version: 0.2.38
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,5 +0,0 @@
1
- """Pacote principal do CLI Raijin Server."""
2
-
3
- __version__ = "0.2.37"
4
-
5
- __all__ = ["__version__"]
File without changes
File without changes