raijin-server 0.2.38__tar.gz → 0.2.40__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.38/src/raijin_server.egg-info → raijin_server-0.2.40}/PKG-INFO +2 -1
  2. {raijin_server-0.2.38 → raijin_server-0.2.40}/README.md +1 -0
  3. {raijin_server-0.2.38 → raijin_server-0.2.40}/setup.cfg +1 -1
  4. raijin_server-0.2.40/src/raijin_server/__init__.py +5 -0
  5. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/minio.py +187 -17
  6. {raijin_server-0.2.38 → raijin_server-0.2.40/src/raijin_server.egg-info}/PKG-INFO +2 -1
  7. raijin_server-0.2.38/src/raijin_server/__init__.py +0 -5
  8. {raijin_server-0.2.38 → raijin_server-0.2.40}/LICENSE +0 -0
  9. {raijin_server-0.2.38 → raijin_server-0.2.40}/pyproject.toml +0 -0
  10. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/cli.py +0 -0
  11. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/config.py +0 -0
  12. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/healthchecks.py +0 -0
  13. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/module_manager.py +0 -0
  14. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/__init__.py +0 -0
  15. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/apokolips_demo.py +0 -0
  16. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/bootstrap.py +0 -0
  17. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/calico.py +0 -0
  18. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/cert_manager.py +0 -0
  19. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/essentials.py +0 -0
  20. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/firewall.py +0 -0
  21. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/full_install.py +0 -0
  22. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/grafana.py +0 -0
  23. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/hardening.py +0 -0
  24. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/harness.py +0 -0
  25. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/istio.py +0 -0
  26. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/kafka.py +0 -0
  27. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/kong.py +0 -0
  28. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/kubernetes.py +0 -0
  29. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/loki.py +0 -0
  30. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/metallb.py +0 -0
  31. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/network.py +0 -0
  32. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/observability_dashboards.py +0 -0
  33. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/observability_ingress.py +0 -0
  34. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/prometheus.py +0 -0
  35. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/sanitize.py +0 -0
  36. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/secrets.py +0 -0
  37. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/ssh_hardening.py +0 -0
  38. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/traefik.py +0 -0
  39. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/velero.py +0 -0
  40. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/modules/vpn.py +0 -0
  41. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/scripts/__init__.py +0 -0
  42. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/scripts/checklist.sh +0 -0
  43. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/scripts/install.sh +0 -0
  44. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/scripts/log_size_metric.sh +0 -0
  45. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/scripts/pre-deploy-check.sh +0 -0
  46. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/utils.py +0 -0
  47. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server/validators.py +0 -0
  48. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server.egg-info/SOURCES.txt +0 -0
  49. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server.egg-info/dependency_links.txt +0 -0
  50. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server.egg-info/entry_points.txt +0 -0
  51. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server.egg-info/requires.txt +0 -0
  52. {raijin_server-0.2.38 → raijin_server-0.2.40}/src/raijin_server.egg-info/top_level.txt +0 -0
  53. {raijin_server-0.2.38 → raijin_server-0.2.40}/tests/test_full_install_sequence.py +0 -0
  54. {raijin_server-0.2.38 → raijin_server-0.2.40}/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.38
3
+ Version: 0.2.40
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
@@ -46,6 +46,7 @@ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Se
46
46
  - Segurança: [SECURITY.md](SECURITY.md)
47
47
  - Acesso SSH (Windows): [docs/SSH_WINDOWS.md](docs/SSH_WINDOWS.md)
48
48
  - VPN para acesso remoto (WireGuard): [docs/VPN_REMOTE_ACCESS.md](docs/VPN_REMOTE_ACCESS.md)
49
+ - MinIO (monitorar/testar): [docs/MINIO_OPERATIONS.md](docs/MINIO_OPERATIONS.md)
49
50
 
50
51
  ## Destaques
51
52
 
@@ -13,6 +13,7 @@ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Se
13
13
  - Segurança: [SECURITY.md](SECURITY.md)
14
14
  - Acesso SSH (Windows): [docs/SSH_WINDOWS.md](docs/SSH_WINDOWS.md)
15
15
  - VPN para acesso remoto (WireGuard): [docs/VPN_REMOTE_ACCESS.md](docs/VPN_REMOTE_ACCESS.md)
16
+ - MinIO (monitorar/testar): [docs/MINIO_OPERATIONS.md](docs/MINIO_OPERATIONS.md)
16
17
 
17
18
  ## Destaques
18
19
 
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = raijin-server
3
- version = 0.2.38
3
+ version = 0.2.40
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.40"
4
+
5
+ __all__ = ["__version__"]
@@ -1,8 +1,12 @@
1
1
  """Deploy do MinIO via Helm com configuracoes production-ready."""
2
2
 
3
+ import json
3
4
  import secrets
4
5
  import socket
6
+ import tempfile
5
7
  import time
8
+ from pathlib import Path
9
+ import textwrap
6
10
 
7
11
  import typer
8
12
 
@@ -12,6 +16,7 @@ LOCAL_PATH_PROVISIONER_URL = (
12
16
  "https://raw.githubusercontent.com/rancher/local-path-provisioner/"
13
17
  "v0.0.30/deploy/local-path-storage.yaml"
14
18
  )
19
+ RAIJIN_LOCAL_PATH_SC_NAME = "raijin-local-path"
15
20
 
16
21
 
17
22
  def _detect_node_name(ctx: ExecutionContext) -> str:
@@ -31,6 +36,51 @@ def _generate_secret(length: int = 32) -> str:
31
36
  return secrets.token_urlsafe(length)[:length]
32
37
 
33
38
 
39
+ def _apply_manifest(ctx: ExecutionContext, manifest: str, description: str) -> bool:
40
+ """Aplica manifest YAML temporario com kubectl."""
41
+ tmp_path = None
42
+ try:
43
+ with tempfile.NamedTemporaryFile("w", delete=False, suffix=".yaml") as tmp:
44
+ tmp.write(manifest)
45
+ tmp.flush()
46
+ tmp_path = Path(tmp.name)
47
+ result = run_cmd(
48
+ ["kubectl", "apply", "-f", str(tmp_path)],
49
+ ctx,
50
+ check=False,
51
+ )
52
+ if result.returncode != 0:
53
+ typer.secho(f" Falha ao aplicar {description}.", fg=typer.colors.RED)
54
+ return False
55
+ typer.secho(f" ✓ {description} aplicado.", fg=typer.colors.GREEN)
56
+ return True
57
+ finally:
58
+ if tmp_path and tmp_path.exists():
59
+ tmp_path.unlink(missing_ok=True)
60
+
61
+
62
+ def _create_raijin_local_path_sc(ctx: ExecutionContext) -> bool:
63
+ """Cria StorageClass com volumeBindingMode=Immediate baseada no local-path."""
64
+ manifest = textwrap.dedent(
65
+ f"""
66
+ apiVersion: storage.k8s.io/v1
67
+ kind: StorageClass
68
+ metadata:
69
+ name: {RAIJIN_LOCAL_PATH_SC_NAME}
70
+ provisioner: rancher.io/local-path
71
+ reclaimPolicy: Delete
72
+ volumeBindingMode: Immediate
73
+ allowVolumeExpansion: true
74
+ parameters:
75
+ type: ""
76
+ """
77
+ ).strip()
78
+ typer.echo(
79
+ f"Criando StorageClass '{RAIJIN_LOCAL_PATH_SC_NAME}' com binding imediato para PVCs do MinIO..."
80
+ )
81
+ return _apply_manifest(ctx, manifest, f"StorageClass {RAIJIN_LOCAL_PATH_SC_NAME}")
82
+
83
+
34
84
  def _get_default_storage_class(ctx: ExecutionContext) -> str:
35
85
  """Retorna o nome da StorageClass default do cluster, se existir."""
36
86
  result = run_cmd(
@@ -58,6 +108,102 @@ def _list_storage_classes(ctx: ExecutionContext) -> list:
58
108
  return []
59
109
 
60
110
 
111
+ def _patch_local_path_provisioner_tolerations(ctx: ExecutionContext) -> None:
112
+ """Adiciona tolerations ao local-path-provisioner para rodar em control-plane."""
113
+ typer.echo(" Configurando tolerations no local-path-provisioner...")
114
+
115
+ # Patch no deployment para tolerar control-plane
116
+ patch_deployment = textwrap.dedent(
117
+ """
118
+ spec:
119
+ template:
120
+ spec:
121
+ tolerations:
122
+ - key: node-role.kubernetes.io/control-plane
123
+ operator: Exists
124
+ effect: NoSchedule
125
+ - key: node-role.kubernetes.io/master
126
+ operator: Exists
127
+ effect: NoSchedule
128
+ """
129
+ ).strip()
130
+
131
+ result = run_cmd(
132
+ [
133
+ "kubectl", "-n", "local-path-storage", "patch", "deployment",
134
+ "local-path-provisioner", "--patch", patch_deployment,
135
+ ],
136
+ ctx,
137
+ check=False,
138
+ )
139
+ if result.returncode == 0:
140
+ typer.secho(" ✓ Deployment patched com tolerations.", fg=typer.colors.GREEN)
141
+
142
+ # Patch no ConfigMap para os helper pods (que criam os dirs no node)
143
+ # O local-path-provisioner usa um ConfigMap com helperPod template
144
+ helper_pod_config = {
145
+ "nodePathMap": [
146
+ {
147
+ "node": "DEFAULT_PATH_FOR_NON_LISTED_NODES",
148
+ "paths": ["/opt/local-path-provisioner"]
149
+ }
150
+ ],
151
+ "setupCommand": None,
152
+ "teardownCommand": None,
153
+ "helperPod": {
154
+ "apiVersion": "v1",
155
+ "kind": "Pod",
156
+ "metadata": {},
157
+ "spec": {
158
+ "tolerations": [
159
+ {"key": "node-role.kubernetes.io/control-plane", "operator": "Exists", "effect": "NoSchedule"},
160
+ {"key": "node-role.kubernetes.io/master", "operator": "Exists", "effect": "NoSchedule"}
161
+ ],
162
+ "containers": [
163
+ {
164
+ "name": "helper-pod",
165
+ "image": "busybox:stable",
166
+ "imagePullPolicy": "IfNotPresent"
167
+ }
168
+ ]
169
+ }
170
+ }
171
+ }
172
+
173
+ # Converte para JSON string para o patch
174
+ config_json_str = json.dumps(helper_pod_config)
175
+ patch_data = json.dumps({"data": {"config.json": config_json_str}})
176
+
177
+ # Aplica via patch no ConfigMap
178
+ result = run_cmd(
179
+ [
180
+ "kubectl", "-n", "local-path-storage", "patch", "configmap",
181
+ "local-path-config", "--type=merge", "-p", patch_data,
182
+ ],
183
+ ctx,
184
+ check=False,
185
+ )
186
+ if result.returncode == 0:
187
+ typer.secho(" ✓ ConfigMap patched para helper pods.", fg=typer.colors.GREEN)
188
+
189
+ # Reinicia o deployment para aplicar as mudanças
190
+ run_cmd(
191
+ ["kubectl", "-n", "local-path-storage", "rollout", "restart", "deployment/local-path-provisioner"],
192
+ ctx,
193
+ check=False,
194
+ )
195
+
196
+ # Aguarda rollout
197
+ run_cmd(
198
+ [
199
+ "kubectl", "-n", "local-path-storage", "rollout", "status",
200
+ "deployment/local-path-provisioner", "--timeout=60s",
201
+ ],
202
+ ctx,
203
+ check=False,
204
+ )
205
+
206
+
61
207
  def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
62
208
  """Instala local-path-provisioner para usar storage local (NVMe/SSD)."""
63
209
  typer.echo("Instalando local-path-provisioner para storage local...")
@@ -71,7 +217,7 @@ def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
71
217
  typer.secho(" Falha ao instalar local-path-provisioner.", fg=typer.colors.RED)
72
218
  return False
73
219
 
74
- # Aguarda deployment ficar pronto
220
+ # Aguarda deployment ficar pronto inicialmente
75
221
  typer.echo(" Aguardando local-path-provisioner ficar Ready...")
76
222
  run_cmd(
77
223
  [
@@ -82,7 +228,10 @@ def _install_local_path_provisioner(ctx: ExecutionContext) -> bool:
82
228
  check=False,
83
229
  )
84
230
 
85
- typer.secho(" ✓ local-path-provisioner instalado.", fg=typer.colors.GREEN)
231
+ # Aplica tolerations para control-plane (single-node clusters)
232
+ _patch_local_path_provisioner_tolerations(ctx)
233
+
234
+ typer.secho(" ✓ local-path-provisioner instalado e configurado.", fg=typer.colors.GREEN)
86
235
  return True
87
236
 
88
237
 
@@ -117,28 +266,46 @@ def _set_default_storage_class(ctx: ExecutionContext, name: str) -> None:
117
266
 
118
267
  def _ensure_storage_class(ctx: ExecutionContext) -> str:
119
268
  """Garante que existe uma StorageClass disponivel, instalando local-path se necessario."""
120
- # Verifica se ja tem default
121
269
  default_sc = _get_default_storage_class(ctx)
122
- if default_sc:
270
+ available = _list_storage_classes(ctx)
271
+
272
+ # Se ja houver StorageClass dedicada do Raijin, usa ela
273
+ if default_sc == RAIJIN_LOCAL_PATH_SC_NAME:
123
274
  typer.echo(f"StorageClass default detectada: {default_sc}")
275
+ # Garante que o provisioner tem tolerations (pode ter sido instalado antes do fix)
276
+ _patch_local_path_provisioner_tolerations(ctx)
124
277
  return default_sc
125
-
126
- # Lista classes disponiveis
127
- available = _list_storage_classes(ctx)
278
+ if RAIJIN_LOCAL_PATH_SC_NAME in available:
279
+ typer.echo(f"StorageClass '{RAIJIN_LOCAL_PATH_SC_NAME}' detectada.")
280
+ _patch_local_path_provisioner_tolerations(ctx)
281
+ _set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
282
+ return RAIJIN_LOCAL_PATH_SC_NAME
283
+
284
+ # Se ja existir default diferente de local-path, respeita configuracao do cluster
285
+ if default_sc and default_sc != "local-path":
286
+ typer.echo(f"StorageClass default detectada: {default_sc}")
287
+ return default_sc
288
+
289
+ # Se local-path estiver disponivel (default ou nao), cria uma classe dedicada com binding imediato
290
+ if "local-path" in available or default_sc == "local-path":
291
+ # Garante tolerations no provisioner existente
292
+ _patch_local_path_provisioner_tolerations(ctx)
293
+ if _create_raijin_local_path_sc(ctx):
294
+ _set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
295
+ return RAIJIN_LOCAL_PATH_SC_NAME
296
+ typer.echo("Nao foi possivel criar StorageClass dedicada; usando 'local-path'.")
297
+ _set_default_storage_class(ctx, "local-path")
298
+ return "local-path"
299
+
128
300
  if available:
129
301
  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
302
  choice = typer.prompt(
136
303
  f"Qual StorageClass usar? ({'/'.join(available)})",
137
304
  default=available[0],
138
305
  )
139
306
  return choice
140
-
141
- # Sem StorageClass - instala local-path-provisioner
307
+
308
+ # Nenhuma StorageClass disponivel - instala local-path automaticamente
142
309
  typer.secho(
143
310
  "Nenhuma StorageClass encontrada no cluster.",
144
311
  fg=typer.colors.YELLOW,
@@ -153,11 +320,14 @@ def _ensure_storage_class(ctx: ExecutionContext) -> str:
153
320
  fg=typer.colors.RED,
154
321
  )
155
322
  raise typer.Exit(1)
156
-
323
+
157
324
  if not _install_local_path_provisioner(ctx):
158
325
  raise typer.Exit(1)
159
-
160
- # Define como default
326
+
327
+ if _create_raijin_local_path_sc(ctx):
328
+ _set_default_storage_class(ctx, RAIJIN_LOCAL_PATH_SC_NAME)
329
+ return RAIJIN_LOCAL_PATH_SC_NAME
330
+
161
331
  _set_default_storage_class(ctx, "local-path")
162
332
  return "local-path"
163
333
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.38
3
+ Version: 0.2.40
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
@@ -46,6 +46,7 @@ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Se
46
46
  - Segurança: [SECURITY.md](SECURITY.md)
47
47
  - Acesso SSH (Windows): [docs/SSH_WINDOWS.md](docs/SSH_WINDOWS.md)
48
48
  - VPN para acesso remoto (WireGuard): [docs/VPN_REMOTE_ACCESS.md](docs/VPN_REMOTE_ACCESS.md)
49
+ - MinIO (monitorar/testar): [docs/MINIO_OPERATIONS.md](docs/MINIO_OPERATIONS.md)
49
50
 
50
51
  ## Destaques
51
52
 
@@ -1,5 +0,0 @@
1
- """Pacote principal do CLI Raijin Server."""
2
-
3
- __version__ = "0.2.38"
4
-
5
- __all__ = ["__version__"]
File without changes