raijin-server 0.2.12__tar.gz → 0.2.14__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 (54) hide show
  1. {raijin_server-0.2.12/src/raijin_server.egg-info → raijin_server-0.2.14}/PKG-INFO +1 -1
  2. {raijin_server-0.2.12 → raijin_server-0.2.14}/setup.cfg +1 -1
  3. raijin_server-0.2.14/src/raijin_server/__init__.py +5 -0
  4. raijin_server-0.2.14/src/raijin_server/modules/metallb.py +140 -0
  5. {raijin_server-0.2.12 → raijin_server-0.2.14/src/raijin_server.egg-info}/PKG-INFO +1 -1
  6. raijin_server-0.2.12/src/raijin_server/__init__.py +0 -5
  7. raijin_server-0.2.12/src/raijin_server/modules/metallb.py +0 -85
  8. {raijin_server-0.2.12 → raijin_server-0.2.14}/LICENSE +0 -0
  9. {raijin_server-0.2.12 → raijin_server-0.2.14}/README.md +0 -0
  10. {raijin_server-0.2.12 → raijin_server-0.2.14}/pyproject.toml +0 -0
  11. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/cli.py +0 -0
  12. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/config.py +0 -0
  13. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/healthchecks.py +0 -0
  14. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/__init__.py +0 -0
  15. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/apokolips_demo.py +0 -0
  16. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/bootstrap.py +0 -0
  17. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/calico.py +0 -0
  18. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/cert_manager.py +0 -0
  19. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/essentials.py +0 -0
  20. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/firewall.py +0 -0
  21. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/full_install.py +0 -0
  22. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/grafana.py +0 -0
  23. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/hardening.py +0 -0
  24. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/harness.py +0 -0
  25. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/istio.py +0 -0
  26. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/kafka.py +0 -0
  27. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/kong.py +0 -0
  28. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/kubernetes.py +0 -0
  29. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/loki.py +0 -0
  30. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/minio.py +0 -0
  31. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/network.py +0 -0
  32. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/observability_dashboards.py +0 -0
  33. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/observability_ingress.py +0 -0
  34. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/prometheus.py +0 -0
  35. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/sanitize.py +0 -0
  36. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/secrets.py +0 -0
  37. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/ssh_hardening.py +0 -0
  38. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/traefik.py +0 -0
  39. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/velero.py +0 -0
  40. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/modules/vpn.py +0 -0
  41. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/scripts/__init__.py +0 -0
  42. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/scripts/checklist.sh +0 -0
  43. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/scripts/install.sh +0 -0
  44. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/scripts/log_size_metric.sh +0 -0
  45. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/scripts/pre-deploy-check.sh +0 -0
  46. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/utils.py +0 -0
  47. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server/validators.py +0 -0
  48. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server.egg-info/SOURCES.txt +0 -0
  49. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server.egg-info/dependency_links.txt +0 -0
  50. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server.egg-info/entry_points.txt +0 -0
  51. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server.egg-info/requires.txt +0 -0
  52. {raijin_server-0.2.12 → raijin_server-0.2.14}/src/raijin_server.egg-info/top_level.txt +0 -0
  53. {raijin_server-0.2.12 → raijin_server-0.2.14}/tests/test_full_install_sequence.py +0 -0
  54. {raijin_server-0.2.12 → raijin_server-0.2.14}/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.12
3
+ Version: 0.2.14
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.12
3
+ version = 0.2.14
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.14"
4
+
5
+ __all__ = ["__version__"]
@@ -0,0 +1,140 @@
1
+ """Provisiona MetalLB (L2) com pool de IPs para LoadBalancer em ambientes bare metal."""
2
+
3
+ import socket
4
+
5
+ import typer
6
+
7
+ from raijin_server.utils import ExecutionContext, helm_upgrade_install, require_root, run_cmd
8
+
9
+
10
+ def _detect_node_name(ctx: ExecutionContext) -> str:
11
+ """Tenta obter o nome do node via kubectl; fallback para hostname local."""
12
+
13
+ result = run_cmd(
14
+ [
15
+ "kubectl",
16
+ "get",
17
+ "nodes",
18
+ "-o",
19
+ "jsonpath={.items[0].metadata.name}",
20
+ ],
21
+ ctx,
22
+ check=False,
23
+ )
24
+ if result.returncode == 0:
25
+ node_name = (result.stdout or "").strip()
26
+ if node_name:
27
+ return node_name
28
+ return socket.gethostname()
29
+
30
+
31
+ def _rollout_wait(kind: str, name: str, ctx: ExecutionContext) -> None:
32
+ run_cmd([
33
+ "kubectl",
34
+ "-n",
35
+ "metallb-system",
36
+ "rollout",
37
+ "status",
38
+ f"{kind}/{name}",
39
+ "--timeout",
40
+ "180s",
41
+ ], ctx, check=False)
42
+
43
+
44
+ def _wait_webhook(ctx: ExecutionContext) -> None:
45
+ # Descobre o nome do deployment do webhook (varia conforme chart), entao aguarda disponibilidade
46
+ result = run_cmd(
47
+ [
48
+ "kubectl",
49
+ "-n",
50
+ "metallb-system",
51
+ "get",
52
+ "deploy",
53
+ "-l",
54
+ "app.kubernetes.io/component=webhook",
55
+ "-o",
56
+ "jsonpath={.items[0].metadata.name}",
57
+ ],
58
+ ctx,
59
+ check=False,
60
+ )
61
+ if result.returncode == 0:
62
+ name = (result.stdout or "").strip()
63
+ if name:
64
+ _rollout_wait("deployment", name, ctx)
65
+
66
+
67
+ def run(ctx: ExecutionContext) -> None:
68
+ require_root(ctx)
69
+ typer.echo("Instalando MetalLB via Helm...")
70
+
71
+ pool = typer.prompt(
72
+ "Pool de IPs (range ou CIDR) para services LoadBalancer",
73
+ default="192.168.1.100-192.168.1.250",
74
+ )
75
+
76
+ node_name = _detect_node_name(ctx)
77
+
78
+ values = [
79
+ # Permite agendar em control-plane de cluster single-node
80
+ "controller.tolerations[0].key=node-role.kubernetes.io/control-plane",
81
+ "controller.tolerations[0].operator=Exists",
82
+ "controller.tolerations[0].effect=NoSchedule",
83
+ "controller.tolerations[1].key=node-role.kubernetes.io/master",
84
+ "controller.tolerations[1].operator=Exists",
85
+ "controller.tolerations[1].effect=NoSchedule",
86
+ "speaker.tolerations[0].key=node-role.kubernetes.io/control-plane",
87
+ "speaker.tolerations[0].operator=Exists",
88
+ "speaker.tolerations[0].effect=NoSchedule",
89
+ "speaker.tolerations[1].key=node-role.kubernetes.io/master",
90
+ "speaker.tolerations[1].operator=Exists",
91
+ "speaker.tolerations[1].effect=NoSchedule",
92
+ f"controller.nodeSelector.kubernetes.io/hostname={node_name}",
93
+ f"speaker.nodeSelector.kubernetes.io/hostname={node_name}",
94
+ ]
95
+
96
+ # Instala control-plane + speaker
97
+ helm_upgrade_install(
98
+ release="metallb",
99
+ chart="metallb",
100
+ namespace="metallb-system",
101
+ repo="metallb",
102
+ repo_url="https://metallb.github.io/metallb",
103
+ ctx=ctx,
104
+ values=values,
105
+ )
106
+
107
+ # Espera recursos principais ficarem prontos
108
+ _rollout_wait("deployment", "controller", ctx)
109
+ _rollout_wait("daemonset", "speaker", ctx)
110
+ _wait_webhook(ctx)
111
+ run_cmd(["sleep", "5"], ctx, check=False) # pequeno buffer para webhook responder
112
+
113
+ # Aplica IPAddressPool + L2Advertisement
114
+ manifest = f"""
115
+ apiVersion: metallb.io/v1beta1
116
+ kind: IPAddressPool
117
+ metadata:
118
+ name: raijin-pool
119
+ namespace: metallb-system
120
+ spec:
121
+ addresses:
122
+ - {pool}
123
+ ---
124
+ apiVersion: metallb.io/v1beta1
125
+ kind: L2Advertisement
126
+ metadata:
127
+ name: raijin-l2
128
+ namespace: metallb-system
129
+ spec:
130
+ ipAddressPools:
131
+ - raijin-pool
132
+ """
133
+
134
+ run_cmd(
135
+ f"echo '{manifest}' | kubectl apply -f -",
136
+ ctx,
137
+ use_shell=True,
138
+ )
139
+
140
+ typer.secho("\n✓ MetalLB aplicado. Services LoadBalancer usarao o pool informado.", fg=typer.colors.GREEN, bold=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.12
3
+ Version: 0.2.14
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.12"
4
-
5
- __all__ = ["__version__"]
@@ -1,85 +0,0 @@
1
- """Provisiona MetalLB (L2) com pool de IPs para LoadBalancer em ambientes bare metal."""
2
-
3
- import typer
4
-
5
- from raijin_server.utils import ExecutionContext, helm_upgrade_install, require_root, run_cmd
6
-
7
-
8
- def run(ctx: ExecutionContext) -> None:
9
- require_root(ctx)
10
- typer.echo("Instalando MetalLB via Helm...")
11
-
12
- pool = typer.prompt(
13
- "Pool de IPs (range ou CIDR) para services LoadBalancer",
14
- default="192.168.1.240-192.168.1.250",
15
- )
16
-
17
- # Instala control-plane + speaker
18
- helm_upgrade_install(
19
- release="metallb",
20
- chart="metallb",
21
- namespace="metallb-system",
22
- repo="metallb",
23
- repo_url="https://metallb.github.io/metallb",
24
- ctx=ctx,
25
- values=[],
26
- )
27
-
28
- # Espera recursos principais ficarem prontos
29
- run_cmd(
30
- [
31
- "kubectl",
32
- "-n",
33
- "metallb-system",
34
- "rollout",
35
- "status",
36
- "deployment/controller",
37
- "--timeout",
38
- "180s",
39
- ],
40
- ctx,
41
- check=False,
42
- )
43
- run_cmd(
44
- [
45
- "kubectl",
46
- "-n",
47
- "metallb-system",
48
- "rollout",
49
- "status",
50
- "daemonset/speaker",
51
- "--timeout",
52
- "180s",
53
- ],
54
- ctx,
55
- check=False,
56
- )
57
-
58
- # Aplica IPAddressPool + L2Advertisement
59
- manifest = f"""
60
- apiVersion: metallb.io/v1beta1
61
- kind: IPAddressPool
62
- metadata:
63
- name: raijin-pool
64
- namespace: metallb-system
65
- spec:
66
- addresses:
67
- - {pool}
68
- ---
69
- apiVersion: metallb.io/v1beta1
70
- kind: L2Advertisement
71
- metadata:
72
- name: raijin-l2
73
- namespace: metallb-system
74
- spec:
75
- ipAddressPools:
76
- - raijin-pool
77
- """
78
-
79
- run_cmd(
80
- f"echo '{manifest}' | kubectl apply -f -",
81
- ctx,
82
- use_shell=True,
83
- )
84
-
85
- typer.secho("\n✓ MetalLB aplicado. Services LoadBalancer usarao o pool informado.", fg=typer.colors.GREEN, bold=True)
File without changes
File without changes