raijin-server 0.2.23__tar.gz → 0.2.24__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 (53) hide show
  1. {raijin_server-0.2.23/src/raijin_server.egg-info → raijin_server-0.2.24}/PKG-INFO +1 -1
  2. {raijin_server-0.2.23 → raijin_server-0.2.24}/setup.cfg +1 -1
  3. raijin_server-0.2.24/src/raijin_server/__init__.py +5 -0
  4. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/istio.py +84 -25
  5. {raijin_server-0.2.23 → raijin_server-0.2.24/src/raijin_server.egg-info}/PKG-INFO +1 -1
  6. raijin_server-0.2.23/src/raijin_server/__init__.py +0 -5
  7. {raijin_server-0.2.23 → raijin_server-0.2.24}/LICENSE +0 -0
  8. {raijin_server-0.2.23 → raijin_server-0.2.24}/README.md +0 -0
  9. {raijin_server-0.2.23 → raijin_server-0.2.24}/pyproject.toml +0 -0
  10. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/cli.py +0 -0
  11. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/config.py +0 -0
  12. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/healthchecks.py +0 -0
  13. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/__init__.py +0 -0
  14. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/apokolips_demo.py +0 -0
  15. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/bootstrap.py +0 -0
  16. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/calico.py +0 -0
  17. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/cert_manager.py +0 -0
  18. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/essentials.py +0 -0
  19. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/firewall.py +0 -0
  20. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/full_install.py +0 -0
  21. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/grafana.py +0 -0
  22. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/hardening.py +0 -0
  23. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/harness.py +0 -0
  24. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/kafka.py +0 -0
  25. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/kong.py +0 -0
  26. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/kubernetes.py +0 -0
  27. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/loki.py +0 -0
  28. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/metallb.py +0 -0
  29. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/minio.py +0 -0
  30. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/network.py +0 -0
  31. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/observability_dashboards.py +0 -0
  32. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/observability_ingress.py +0 -0
  33. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/prometheus.py +0 -0
  34. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/sanitize.py +0 -0
  35. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/secrets.py +0 -0
  36. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/ssh_hardening.py +0 -0
  37. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/traefik.py +0 -0
  38. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/velero.py +0 -0
  39. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/modules/vpn.py +0 -0
  40. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/scripts/__init__.py +0 -0
  41. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/scripts/checklist.sh +0 -0
  42. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/scripts/install.sh +0 -0
  43. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/scripts/log_size_metric.sh +0 -0
  44. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/scripts/pre-deploy-check.sh +0 -0
  45. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/utils.py +0 -0
  46. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server/validators.py +0 -0
  47. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server.egg-info/SOURCES.txt +0 -0
  48. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server.egg-info/dependency_links.txt +0 -0
  49. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server.egg-info/entry_points.txt +0 -0
  50. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server.egg-info/requires.txt +0 -0
  51. {raijin_server-0.2.23 → raijin_server-0.2.24}/src/raijin_server.egg-info/top_level.txt +0 -0
  52. {raijin_server-0.2.23 → raijin_server-0.2.24}/tests/test_full_install_sequence.py +0 -0
  53. {raijin_server-0.2.23 → raijin_server-0.2.24}/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.23
3
+ Version: 0.2.24
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.23
3
+ version = 0.2.24
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.24"
4
+
5
+ __all__ = ["__version__"]
@@ -2,10 +2,11 @@
2
2
 
3
3
  import socket
4
4
  import time
5
+ from pathlib import Path
5
6
 
6
7
  import typer
7
8
 
8
- from raijin_server.utils import ExecutionContext, ensure_tool, require_root, run_cmd
9
+ from raijin_server.utils import ExecutionContext, ensure_tool, require_root, run_cmd, write_file
9
10
 
10
11
 
11
12
  ISTIO_PROFILES = ["default", "demo", "minimal", "ambient", "empty"]
@@ -23,6 +24,16 @@ def _detect_node_name(ctx: ExecutionContext) -> str:
23
24
  return socket.gethostname()
24
25
 
25
26
 
27
+ def _check_metallb_installed(ctx: ExecutionContext) -> bool:
28
+ """Verifica se MetalLB está instalado no cluster."""
29
+ result = run_cmd(
30
+ ["kubectl", "get", "deployment", "metallb-controller", "-n", "metallb-system"],
31
+ ctx,
32
+ check=False,
33
+ )
34
+ return result.returncode == 0
35
+
36
+
26
37
  def _check_existing_istio(ctx: ExecutionContext) -> bool:
27
38
  """Verifica se existe instalacao do Istio."""
28
39
  result = run_cmd(
@@ -112,34 +123,72 @@ def run(ctx: ExecutionContext) -> None:
112
123
  typer.secho(f"Perfil '{profile}' invalido. Usando 'default'.", fg=typer.colors.YELLOW)
113
124
  profile = "default"
114
125
 
126
+ # Detectar se MetalLB está instalado
127
+ has_metallb = _check_metallb_installed(ctx)
128
+
129
+ # Se não tem MetalLB, avisar e usar NodePort
130
+ if not has_metallb:
131
+ typer.secho(
132
+ "\n⚠ MetalLB não detectado. O IngressGateway será configurado como NodePort.",
133
+ fg=typer.colors.YELLOW,
134
+ )
135
+ typer.echo("Para usar LoadBalancer, instale MetalLB primeiro: raijin-server install metallb")
136
+ service_type = "NodePort"
137
+ else:
138
+ typer.secho("\n✓ MetalLB detectado. IngressGateway usará LoadBalancer.", fg=typer.colors.GREEN)
139
+ service_type = "LoadBalancer"
140
+
115
141
  node_name = _detect_node_name(ctx)
116
142
 
117
- # Instala com tolerations para control-plane
118
- # IMPORTANTE: Ao fazer override em arrays do Istio, precisamos especificar o 'name'
119
- # do componente para que o merge funcione corretamente
143
+ # Criar arquivo IstioOperator YAML (mais confiável que --set para configurações complexas)
144
+ istio_config = f"""apiVersion: install.istio.io/v1alpha1
145
+ kind: IstioOperator
146
+ metadata:
147
+ namespace: istio-system
148
+ spec:
149
+ profile: {profile}
150
+ components:
151
+ pilot:
152
+ enabled: true
153
+ k8s:
154
+ tolerations:
155
+ - key: node-role.kubernetes.io/control-plane
156
+ operator: Exists
157
+ effect: NoSchedule
158
+ - key: node-role.kubernetes.io/master
159
+ operator: Exists
160
+ effect: NoSchedule
161
+ nodeSelector:
162
+ kubernetes.io/hostname: {node_name}
163
+ ingressGateways:
164
+ - name: istio-ingressgateway
165
+ enabled: true
166
+ k8s:
167
+ tolerations:
168
+ - key: node-role.kubernetes.io/control-plane
169
+ operator: Exists
170
+ effect: NoSchedule
171
+ - key: node-role.kubernetes.io/master
172
+ operator: Exists
173
+ effect: NoSchedule
174
+ nodeSelector:
175
+ kubernetes.io/hostname: {node_name}
176
+ service:
177
+ type: {service_type}
178
+ values:
179
+ global:
180
+ proxy:
181
+ holdApplicationUntilProxyStarts: true
182
+ """
183
+
184
+ config_path = Path("/tmp/raijin-istio-config.yaml")
185
+ write_file(config_path, istio_config, ctx)
186
+
187
+ # Instala usando o arquivo de configuração
120
188
  install_cmd = [
121
189
  "istioctl", "install",
122
- "--set", f"profile={profile}",
123
- # Tolerations para istiod (control plane)
124
- "--set", "components.pilot.k8s.tolerations[0].key=node-role.kubernetes.io/control-plane",
125
- "--set", "components.pilot.k8s.tolerations[0].operator=Exists",
126
- "--set", "components.pilot.k8s.tolerations[0].effect=NoSchedule",
127
- "--set", "components.pilot.k8s.tolerations[1].key=node-role.kubernetes.io/master",
128
- "--set", "components.pilot.k8s.tolerations[1].operator=Exists",
129
- "--set", "components.pilot.k8s.tolerations[1].effect=NoSchedule",
130
- # NodeSelector para istiod
131
- "--set", f"components.pilot.k8s.nodeSelector.kubernetes\\.io/hostname={node_name}",
132
- # Tolerations para ingress gateway (DEVE incluir o name!)
133
- "--set", "components.ingressGateways[0].name=istio-ingressgateway",
134
- "--set", "components.ingressGateways[0].enabled=true",
135
- "--set", "components.ingressGateways[0].k8s.tolerations[0].key=node-role.kubernetes.io/control-plane",
136
- "--set", "components.ingressGateways[0].k8s.tolerations[0].operator=Exists",
137
- "--set", "components.ingressGateways[0].k8s.tolerations[0].effect=NoSchedule",
138
- "--set", "components.ingressGateways[0].k8s.tolerations[1].key=node-role.kubernetes.io/master",
139
- "--set", "components.ingressGateways[0].k8s.tolerations[1].operator=Exists",
140
- "--set", "components.ingressGateways[0].k8s.tolerations[1].effect=NoSchedule",
141
- # NodeSelector para ingress gateway
142
- "--set", f"components.ingressGateways[0].k8s.nodeSelector.kubernetes\\.io/hostname={node_name}",
190
+ "-f", str(config_path),
191
+ "--timeout", "10m",
143
192
  "-y",
144
193
  ]
145
194
 
@@ -161,3 +210,13 @@ def run(ctx: ExecutionContext) -> None:
161
210
  )
162
211
 
163
212
  typer.secho("\n✓ Istio instalado com sucesso.", fg=typer.colors.GREEN, bold=True)
213
+
214
+ if service_type == "NodePort":
215
+ typer.echo("\n📌 Acesso ao Istio IngressGateway (NodePort):")
216
+ typer.echo(" kubectl get svc -n istio-system istio-ingressgateway")
217
+ typer.echo("\nPara expor via LoadBalancer, instale MetalLB:")
218
+ typer.echo(" raijin-server install metallb")
219
+ else:
220
+ typer.echo("\n📌 Acesso ao Istio IngressGateway (LoadBalancer):")
221
+ typer.echo(" kubectl get svc -n istio-system istio-ingressgateway")
222
+ typer.echo(" Aguarde o EXTERNAL-IP ser atribuido pelo MetalLB")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.23
3
+ Version: 0.2.24
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.23"
4
-
5
- __all__ = ["__version__"]
File without changes
File without changes