raijin-server 0.2.33__py3-none-any.whl → 0.2.35__py3-none-any.whl

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.

raijin_server/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  """Pacote principal do CLI Raijin Server."""
2
2
 
3
- __version__ = "0.2.33"
3
+ __version__ = "0.2.35"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -124,6 +124,35 @@ def run(ctx: ExecutionContext) -> None:
124
124
  "Modo de operacao (standalone/distributed)",
125
125
  default="standalone",
126
126
  )
127
+ is_distributed = mode.lower().startswith("d")
128
+
129
+ replicas = 1
130
+ resources_req_cpu = "250m"
131
+ resources_req_mem = "512Mi"
132
+ resources_lim_cpu = "500m"
133
+ resources_lim_mem = "1Gi"
134
+
135
+ if is_distributed:
136
+ replicas = typer.prompt(
137
+ "Qtd de pods MinIO (replicas)",
138
+ default="4",
139
+ )
140
+ resources_req_cpu = typer.prompt(
141
+ "CPU request por pod (distributed)",
142
+ default="500m",
143
+ )
144
+ resources_req_mem = typer.prompt(
145
+ "Memoria request por pod (distributed)",
146
+ default="1Gi",
147
+ )
148
+ resources_lim_cpu = typer.prompt(
149
+ "CPU limit por pod (distributed)",
150
+ default="1",
151
+ )
152
+ resources_lim_mem = typer.prompt(
153
+ "Memoria limit por pod (distributed)",
154
+ default="2Gi",
155
+ )
127
156
 
128
157
  root_user = typer.prompt("Root user (admin)", default="minio-admin")
129
158
  root_password = typer.prompt(
@@ -147,10 +176,11 @@ def run(ctx: ExecutionContext) -> None:
147
176
  # Persistence
148
177
  "persistence.enabled=true",
149
178
  f"persistence.size={persistence_size}",
150
- # Resources (production defaults)
151
- "resources.requests.memory=512Mi",
152
- "resources.requests.cpu=250m",
153
- "resources.limits.memory=1Gi",
179
+ # Resources
180
+ f"resources.requests.memory={resources_req_mem}",
181
+ f"resources.requests.cpu={resources_req_cpu}",
182
+ f"resources.limits.memory={resources_lim_mem}",
183
+ f"resources.limits.cpu={resources_lim_cpu}",
154
184
  # Tolerations para control-plane
155
185
  "tolerations[0].key=node-role.kubernetes.io/control-plane",
156
186
  "tolerations[0].operator=Exists",
@@ -161,6 +191,9 @@ def run(ctx: ExecutionContext) -> None:
161
191
  # NodeSelector
162
192
  f"nodeSelector.kubernetes\\.io/hostname={node_name}",
163
193
  ]
194
+
195
+ if is_distributed:
196
+ values.append(f"replicas={replicas}")
164
197
 
165
198
  # Console
166
199
  if enable_console:
@@ -13,7 +13,19 @@ from raijin_server.utils import ExecutionContext, apt_install, require_root, run
13
13
  SSHD_DROPIN = Path("/etc/ssh/sshd_config.d/99-raijin.conf")
14
14
  FAIL2BAN_JAIL = Path("/etc/fail2ban/jail.d/raijin-sshd.conf")
15
15
  AUTHORIZED_KEYS_TEMPLATE = "# gerenciado pelo raijin-server\n{key}\n"
16
- HARDCODED_PUBKEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOolYckNjqXbvVORhQUz0oqxm/xnaAiLzzZAAVd7+f1Q rafaelluisdacostacoelho@gmail.com"
16
+
17
+
18
+ def _current_non_root_user() -> str | None:
19
+ sudo_user = os.environ.get("SUDO_USER")
20
+ if sudo_user and sudo_user != "root":
21
+ return sudo_user
22
+ try:
23
+ import getpass
24
+
25
+ who = getpass.getuser()
26
+ return who if who != "root" else None
27
+ except Exception:
28
+ return None
17
29
 
18
30
 
19
31
  def _user_exists(username: str) -> bool:
@@ -50,9 +62,26 @@ def _write_authorized_keys(username: str, content: str, ctx: ExecutionContext) -
50
62
  run_cmd(["chown", "-R", f"{username}:{username}", str(ssh_dir)], ctx)
51
63
 
52
64
 
65
+ def _default_pubkey_path() -> Path:
66
+ user = _current_non_root_user()
67
+ if user:
68
+ candidate = Path(f"/home/{user}/.ssh/authorized_keys")
69
+ if candidate.exists():
70
+ return candidate
71
+ return Path.home() / ".ssh/authorized_keys"
72
+
73
+
53
74
  def _load_public_key(path_input: str) -> str:
54
- # Sempre usa a chave embutida solicitada
55
- return HARDCODED_PUBKEY
75
+ path = Path(path_input).expanduser()
76
+ if path.exists():
77
+ content = path.read_text().strip()
78
+ if content:
79
+ return content
80
+ typer.echo("Arquivo nao encontrado. Cole a chave publica completa (ssh-ed25519...).")
81
+ key = typer.prompt("Chave publica", default="")
82
+ if not key:
83
+ raise typer.BadParameter("Nenhuma chave publica fornecida.")
84
+ return key.strip()
56
85
 
57
86
 
58
87
  def run(ctx: ExecutionContext) -> None:
@@ -62,25 +91,34 @@ def run(ctx: ExecutionContext) -> None:
62
91
  typer.echo("Hardening de SSH em andamento...")
63
92
  apt_install(["openssh-server", "fail2ban"], ctx)
64
93
 
65
- username = typer.prompt("Usuario administrativo para SSH", default="adminops")
94
+ username = typer.prompt("Usuario administrativo para SSH", default="thor")
66
95
  ssh_port = typer.prompt("Porta SSH", default="22")
67
96
  sudo_access = typer.confirm("Adicionar usuario ao grupo sudo?", default=True)
68
- extra_users = typer.prompt(
69
- "Usuarios adicionais permitidos (opcional, separados por espaco)", default=""
97
+ current_user = _current_non_root_user()
98
+ default_extra = current_user if current_user and current_user != username else ""
99
+ extra_users_raw = typer.prompt(
100
+ "Usuarios adicionais (serao criados se nao existirem, separados por espaco)",
101
+ default=default_extra,
70
102
  ).strip()
71
103
  pubkey_path = typer.prompt(
72
104
  "Arquivo com chave publica ou authorized_keys existente",
73
- default=str(Path.home() / ".ssh/authorized_keys"),
105
+ default=str(_default_pubkey_path()),
74
106
  )
75
107
 
76
108
  public_key = _load_public_key(pubkey_path)
77
- allow_users = " ".join(part for part in [username, extra_users] if part).strip()
78
-
79
- _ensure_user(username, ctx)
80
- if sudo_access:
81
- run_cmd(["usermod", "-aG", "sudo", username], ctx)
82
109
 
83
- _write_authorized_keys(username, public_key, ctx)
110
+ extra_users = [u for u in extra_users_raw.split() if u]
111
+ target_users: list[str] = []
112
+ for u in [username, *extra_users]:
113
+ if u not in target_users:
114
+ target_users.append(u)
115
+ allow_users = " ".join(target_users)
116
+
117
+ for user in target_users:
118
+ _ensure_user(user, ctx)
119
+ if user == username and sudo_access:
120
+ run_cmd(["usermod", "-aG", "sudo", user], ctx)
121
+ _write_authorized_keys(user, public_key, ctx)
84
122
 
85
123
  config = f"""
86
124
  # Arquivo gerenciado pelo raijin-server
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.33
3
+ Version: 0.2.35
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
@@ -79,18 +79,30 @@ python3 -m venv ~/.venvs/midgard
79
79
  source ~/.venvs/midgard/bin/activate
80
80
  pip install -U pip setuptools
81
81
 
82
- # 2) Instalar a partir do source (dev)
83
- pip install -U raijin-server
82
+ # 2) Instalar a partir do PyPI (ou source)
83
+ pip install -U raijin-server==x.x.x
84
84
 
85
85
  # 3) Uso com sudo preservando o venv
86
86
  sudo -E ~/.venvs/midgard/bin/raijin-server --version
87
87
  sudo -E ~/.venvs/midgard/bin/raijin-server validate
88
88
  sudo -E ~/.venvs/midgard/bin/raijin-server full-install
89
+ sudo -E ~/.venvs/midgard/bin/raijin-server menu
89
90
 
90
91
  # 4) Quando terminar
91
92
  deactivate
92
93
  ```
93
94
 
95
+ > **Após instalar:**
96
+ >
97
+ > Execute:
98
+ >
99
+ > ```bash
100
+ > pip install -U raijin-server==x.x.x
101
+ > sudo -E ~/.venvs/midgard/bin/raijin-server menu
102
+ > ```
103
+ >
104
+ > Isso garante que o menu principal do Raijin Server estará disponível no Ubuntu Server.
105
+
94
106
  > Dica: se precisar reinstalar, remova o venv (`rm -rf ~/.venvs/midgard`), recrie e repita o passo 2. O `-E` no sudo mantém o venv ativo para o Python.
95
107
 
96
108
  # 5. Rodar usando root preservando o venv
@@ -1,4 +1,4 @@
1
- raijin_server/__init__.py,sha256=9mc1Ir67QB8rsEgjIVmyYrPQ2TH8VdvVkWeh8977mY4,95
1
+ raijin_server/__init__.py,sha256=Wa2eQSGUaft7BUQFSKQeBX5yVKrKfRVa7mfEzttqLg0,95
2
2
  raijin_server/cli.py,sha256=2m7q1znMLbBdnUwN6oOUrCZXEqC2e7SfbjYkymbP4lQ,37884
3
3
  raijin_server/config.py,sha256=QNiEVvrbW56XgvNn5-h3bkJm46Xc8mjNqPbvixXD8N0,4829
4
4
  raijin_server/healthchecks.py,sha256=lzXdFw6S0hOYbUKbqksh4phb04lXgXdTspP1Dsz4dx8,15401
@@ -22,14 +22,14 @@ raijin_server/modules/kong.py,sha256=eDSagvEP9_BCs9pZ-pCVs1BDdlYOoJfY5PnUSiTvvgc
22
22
  raijin_server/modules/kubernetes.py,sha256=9E6zV0zGQWZW92NVpxwYctpi-4JDmi6YzF3tKRI4HlU,13343
23
23
  raijin_server/modules/loki.py,sha256=aNiUpnOFppZMXoQwYhn7IoPMzwUz4aHi6pbiqj1PRjc,5022
24
24
  raijin_server/modules/metallb.py,sha256=uUuklc_RsQ-W2qDVRMQAxQm9HKGEqso444b1IwBpM6w,8554
25
- raijin_server/modules/minio.py,sha256=wxL8U1Zl3XtI-wymIeZonmi561v1zf-bY4TTVPKisLA,6221
25
+ raijin_server/modules/minio.py,sha256=rHiyNs1wK2gxAMDUhxhN5zeh8nuyADlmueHiYhEyjL0,7213
26
26
  raijin_server/modules/network.py,sha256=QRlYdcryCCPAWG3QQ_W7ld9gJgETI7H8gwntOU7UqFE,4818
27
27
  raijin_server/modules/observability_dashboards.py,sha256=fVz0WEOQrUTF5rJ__Nu_onyBuwL_exFmysWMmg8AE9w,7319
28
28
  raijin_server/modules/observability_ingress.py,sha256=Fh1rlFWueBNHnOkHuoHYyhILmpO-iQXINybSUYbYsHQ,5738
29
29
  raijin_server/modules/prometheus.py,sha256=wT9jdcC-8vVysVKgMR5isGbxxpvGFPRf7fhMAGd9kJU,10761
30
30
  raijin_server/modules/sanitize.py,sha256=_RnWn1DUuNrzx3NnKEbMvf5iicgjiN_ubwT59e0rYWY,6040
31
31
  raijin_server/modules/secrets.py,sha256=d4j12feQL8m_4-hYN5FfboQHvBc75TFeGno3OzrXokE,9266
32
- raijin_server/modules/ssh_hardening.py,sha256=go3kY4SZWe71LZLSfEeunhts3AqqHYxmQ7rCeezNFL8,4301
32
+ raijin_server/modules/ssh_hardening.py,sha256=Zd0dlylUBr01SkrI1CS05-0DB9xIto5rWH1bUVs80ow,5422
33
33
  raijin_server/modules/traefik.py,sha256=crEYIqAidAhh_H93qIvCbTtJ7BjO-3ef77alLc_--Gg,3535
34
34
  raijin_server/modules/velero.py,sha256=yDtqd6yUu0L5wzLCjYXqvvxB_RyaAoZtntb6HoHVAOo,5642
35
35
  raijin_server/modules/vpn.py,sha256=hF-0vA17VKTxhQLDBSEeqI5aPQpiaaj4IpUf9l6lr64,8297
@@ -38,9 +38,9 @@ raijin_server/scripts/checklist.sh,sha256=j6E0Kmk1EfjLvKK1VpCqzXJAXI_7Bm67LK4ndy
38
38
  raijin_server/scripts/install.sh,sha256=Y1ickbQ4siQ0NIPs6UgrqUr8WWy7U0LHmaTQbEgavoI,3949
39
39
  raijin_server/scripts/log_size_metric.sh,sha256=Iv4SsX8AuCYRou-klYn32mX41xB6j0xJGLBO6riw4rU,1208
40
40
  raijin_server/scripts/pre-deploy-check.sh,sha256=XqMo7IMIpwUHF17YEmU0-cVmTDMoCGMBFnmS39FidI4,4912
41
- raijin_server-0.2.33.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
42
- raijin_server-0.2.33.dist-info/METADATA,sha256=azAxO3niYnCUlG9rKnd7q-Q_1SYv5qSl8aKMKF7qyak,22476
43
- raijin_server-0.2.33.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
44
- raijin_server-0.2.33.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
45
- raijin_server-0.2.33.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
46
- raijin_server-0.2.33.dist-info/RECORD,,
41
+ raijin_server-0.2.35.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
42
+ raijin_server-0.2.35.dist-info/METADATA,sha256=D3rgG1t86vS6joqEpt82Xrm8cx_xnhDYE6lmi34eCbw,22770
43
+ raijin_server-0.2.35.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
44
+ raijin_server-0.2.35.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
45
+ raijin_server-0.2.35.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
46
+ raijin_server-0.2.35.dist-info/RECORD,,