raijin-server 0.1.0__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.
@@ -0,0 +1,230 @@
1
+ """Validadores de pre-requisitos do sistema."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import platform
7
+ import shutil
8
+ import subprocess
9
+ from pathlib import Path
10
+ from typing import List, Tuple
11
+
12
+ import typer
13
+
14
+ from raijin_server.utils import ExecutionContext, logger
15
+
16
+
17
+ class ValidationError(Exception):
18
+ """Erro de validacao de pre-requisitos."""
19
+
20
+ pass
21
+
22
+
23
+ def check_os_version() -> Tuple[bool, str]:
24
+ """Valida se o OS e Ubuntu Server 24.04 ou compativel."""
25
+ try:
26
+ if platform.system() != "Linux":
27
+ return False, f"Sistema operacional nao suportado: {platform.system()}"
28
+
29
+ # Verifica /etc/os-release
30
+ os_release = Path("/etc/os-release")
31
+ if not os_release.exists():
32
+ return False, "Arquivo /etc/os-release nao encontrado"
33
+
34
+ content = os_release.read_text()
35
+ is_ubuntu = "ubuntu" in content.lower()
36
+
37
+ if not is_ubuntu:
38
+ return False, "Sistema nao e Ubuntu"
39
+
40
+ # Extrai versao
41
+ version_line = [line for line in content.split("\n") if line.startswith("VERSION_ID=")]
42
+ if version_line:
43
+ version = version_line[0].split("=")[1].strip('"')
44
+ version_major = float(version.split(".")[0])
45
+ if version_major < 20:
46
+ return False, f"Ubuntu {version} muito antigo (minimo: 20.04)"
47
+
48
+ return True, f"Ubuntu detectado: {version if version_line else 'versao desconhecida'}"
49
+ except Exception as e:
50
+ return False, f"Erro ao verificar OS: {e}"
51
+
52
+
53
+ def check_disk_space(min_gb: int = 20) -> Tuple[bool, str]:
54
+ """Verifica espaco em disco disponivel."""
55
+ try:
56
+ stat = os.statvfs("/")
57
+ free_gb = (stat.f_bavail * stat.f_frsize) / (1024**3)
58
+ if free_gb < min_gb:
59
+ return False, f"Espaco insuficiente: {free_gb:.1f}GB (minimo: {min_gb}GB)"
60
+ return True, f"Espaco em disco OK: {free_gb:.1f}GB disponiveis"
61
+ except Exception as e:
62
+ return False, f"Erro ao verificar disco: {e}"
63
+
64
+
65
+ def check_memory(min_gb: int = 4) -> Tuple[bool, str]:
66
+ """Verifica memoria RAM disponivel."""
67
+ try:
68
+ with open("/proc/meminfo") as f:
69
+ meminfo = f.read()
70
+ mem_total_kb = int([line for line in meminfo.split("\n") if "MemTotal" in line][0].split()[1])
71
+ mem_total_gb = mem_total_kb / (1024**2)
72
+ if mem_total_gb < min_gb:
73
+ return False, f"Memoria insuficiente: {mem_total_gb:.1f}GB (minimo: {min_gb}GB)"
74
+ return True, f"Memoria RAM OK: {mem_total_gb:.1f}GB"
75
+ except Exception as e:
76
+ return False, f"Erro ao verificar memoria: {e}"
77
+
78
+
79
+ def check_connectivity(hosts: List[str] | None = None) -> Tuple[bool, str]:
80
+ """Verifica conectividade com internet."""
81
+ if hosts is None:
82
+ hosts = ["8.8.8.8", "1.1.1.1"]
83
+
84
+ for host in hosts:
85
+ try:
86
+ result = subprocess.run(
87
+ ["ping", "-c", "1", "-W", "2", host],
88
+ capture_output=True,
89
+ timeout=5,
90
+ )
91
+ if result.returncode == 0:
92
+ return True, f"Conectividade OK (testado: {host})"
93
+ except Exception:
94
+ continue
95
+
96
+ return False, "Sem conectividade com internet"
97
+
98
+
99
+ def check_required_commands(commands: List[str] | None = None) -> Tuple[bool, List[str]]:
100
+ """Verifica se comandos essenciais estao disponiveis."""
101
+ if commands is None:
102
+ commands = ["curl", "wget", "apt-get", "systemctl"]
103
+
104
+ missing = []
105
+ for cmd in commands:
106
+ if not shutil.which(cmd):
107
+ missing.append(cmd)
108
+
109
+ if missing:
110
+ return False, missing
111
+ return True, []
112
+
113
+
114
+ def check_is_root() -> Tuple[bool, str]:
115
+ """Verifica se esta executando como root."""
116
+ if os.geteuid() == 0:
117
+ return True, "Executando como root"
118
+ return False, "Usuario nao e root (use sudo)"
119
+
120
+
121
+ def validate_system_requirements(ctx: ExecutionContext, skip_root: bool = False) -> bool:
122
+ """Executa todas as validacoes de pre-requisitos.
123
+
124
+ Returns:
125
+ True se todas as validacoes passaram, False caso contrario.
126
+ """
127
+ logger.info("Iniciando validacao de pre-requisitos do sistema...")
128
+ typer.secho("\n=== Validacao de Pre-requisitos ===", fg=typer.colors.CYAN, bold=True)
129
+
130
+ checks = [
131
+ ("Sistema Operacional", check_os_version()),
132
+ ("Espaco em Disco", check_disk_space()),
133
+ ("Memoria RAM", check_memory()),
134
+ ("Conectividade", check_connectivity()),
135
+ ]
136
+
137
+ if not skip_root:
138
+ checks.insert(0, ("Permissoes Root", check_is_root()))
139
+
140
+ # Comandos essenciais
141
+ cmd_ok, missing = check_required_commands()
142
+ if cmd_ok:
143
+ checks.append(("Comandos Essenciais", (True, "Todos os comandos disponiveis")))
144
+ else:
145
+ checks.append(("Comandos Essenciais", (False, f"Faltando: {', '.join(missing)}")))
146
+
147
+ all_passed = True
148
+ for name, (passed, message) in checks:
149
+ icon = "✓" if passed else "✗"
150
+ color = typer.colors.GREEN if passed else typer.colors.RED
151
+ typer.secho(f" {icon} {name}: {message}", fg=color)
152
+ logger.info(f"Validacao '{name}': {'PASS' if passed else 'FAIL'} - {message}")
153
+
154
+ if not passed:
155
+ all_passed = False
156
+ ctx.errors.append(f"Validacao falhou: {name} - {message}")
157
+
158
+ typer.echo("")
159
+
160
+ if not all_passed:
161
+ if ctx.dry_run:
162
+ typer.secho("⚠ Validacoes falharam, mas continuando em modo dry-run", fg=typer.colors.YELLOW)
163
+ return True
164
+ else:
165
+ typer.secho("✗ Pre-requisitos nao atendidos. Corrija os problemas acima.", fg=typer.colors.RED, bold=True)
166
+ logger.error("Pre-requisitos do sistema nao atendidos")
167
+ return False
168
+
169
+ typer.secho("✓ Todos os pre-requisitos atendidos!", fg=typer.colors.GREEN, bold=True)
170
+ logger.info("Validacao de pre-requisitos concluida com sucesso")
171
+ return True
172
+
173
+
174
+ def check_module_dependencies(module: str, ctx: ExecutionContext) -> bool:
175
+ """Verifica se os modulos dependentes ja foram executados.
176
+
177
+ Args:
178
+ module: Nome do modulo a ser executado
179
+ ctx: Contexto de execucao
180
+
181
+ Returns:
182
+ True se todas as dependencias foram satisfeitas
183
+ """
184
+ dependencies = {
185
+ "kubernetes": ["essentials", "network", "firewall"],
186
+ "calico": ["kubernetes"],
187
+ "istio": ["kubernetes", "calico"],
188
+ "traefik": ["kubernetes"],
189
+ "kong": ["kubernetes"],
190
+ "minio": ["kubernetes"],
191
+ "prometheus": ["kubernetes"],
192
+ "grafana": ["kubernetes", "prometheus"],
193
+ "loki": ["kubernetes"],
194
+ "harness": ["kubernetes"],
195
+ "velero": ["kubernetes"],
196
+ "kafka": ["kubernetes"],
197
+ }
198
+
199
+ if module not in dependencies:
200
+ return True
201
+
202
+ required = dependencies[module]
203
+ missing = []
204
+
205
+ # Verifica arquivos de estado
206
+ state_dir = Path(os.environ.get("RAIJIN_STATE_DIR", "/var/lib/raijin-server/state"))
207
+ if not state_dir.exists():
208
+ state_dir = Path.home() / ".local/share/raijin-server/state"
209
+
210
+ for dep in required:
211
+ state_file = state_dir / f"{dep}.done"
212
+ if not state_file.exists():
213
+ missing.append(dep)
214
+
215
+ if missing:
216
+ if ctx.dry_run:
217
+ typer.secho(
218
+ f"⚠ Modulo '{module}' requer: {', '.join(missing)} (ignorado em dry-run)",
219
+ fg=typer.colors.YELLOW,
220
+ )
221
+ return True
222
+ else:
223
+ typer.secho(
224
+ f"✗ Modulo '{module}' requer os seguintes modulos executados primeiro: {', '.join(missing)}",
225
+ fg=typer.colors.RED,
226
+ )
227
+ logger.error(f"Dependencias nao satisfeitas para modulo '{module}': {missing}")
228
+ return False
229
+
230
+ return True
@@ -0,0 +1,219 @@
1
+ Metadata-Version: 2.4
2
+ Name: raijin-server
3
+ Version: 0.1.0
4
+ Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
+ Home-page: https://example.com/raijin-server
6
+ Author: Equipe Raijin
7
+ License: MIT
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3 :: Only
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: Environment :: Console
14
+ Requires-Python: >=3.9
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: typer>=0.12
18
+ Requires-Dist: rich>=13.7
19
+ Provides-Extra: yaml
20
+ Requires-Dist: pyyaml>=6.0; extra == "yaml"
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest>=7.0; extra == "dev"
23
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
24
+ Requires-Dist: black>=23.0; extra == "dev"
25
+ Requires-Dist: ruff>=0.1; extra == "dev"
26
+ Provides-Extra: all
27
+ Requires-Dist: pyyaml>=6.0; extra == "all"
28
+ Requires-Dist: pytest>=7.0; extra == "all"
29
+ Requires-Dist: pytest-cov>=4.0; extra == "all"
30
+ Requires-Dist: black>=23.0; extra == "all"
31
+ Requires-Dist: ruff>=0.1; extra == "all"
32
+ Dynamic: license-file
33
+
34
+ # raijin-server
35
+
36
+ CLI em Python (Typer) para automatizar setup e hardening de servidores Ubuntu Server em ambientes produtivos. Orquestra rede, firewall, Kubernetes, observabilidade e backups para acelerar a subida de clusters e workloads.
37
+
38
+ **✨ Versão Auditada e Resiliente para Produção**
39
+
40
+ ## Destaques
41
+
42
+ - ✅ **Validações de Pré-requisitos**: OS, espaço em disco, memória, conectividade
43
+ - ✅ **Health Checks Automáticos**: Valida serviços após instalação
44
+ - ✅ **Retry Inteligente**: Resistente a falhas temporárias de rede
45
+ - ✅ **Logging Estruturado**: Logs persistentes para auditoria
46
+ - ✅ **Gestão de Dependências**: Garante ordem correta de execução
47
+ - ✅ **Configuração via Arquivo**: Automação completa com YAML/JSON
48
+ - ✅ **Idempotência**: Re-execução segura sem quebrar o sistema
49
+ - ✅ **Modo Dry-run**: Simula execução sem aplicar mudanças
50
+
51
+ ## Requisitos
52
+
53
+ - Python >= 3.9
54
+ - Ubuntu Server 20.04+ (testado em 24.04)
55
+ - Permissões root/sudo
56
+ - Conectividade com internet
57
+ - Mínimo 4GB RAM, 20GB disco livre
58
+ - Ferramentas: `curl`, `apt-get`, `systemctl`
59
+
60
+ Ferramentas adicionais (instaladas pelos módulos quando necessário):
61
+ - `helm` (>=3.8 para OCI)
62
+ - `kubectl`, `kubeadm`
63
+ - `velero`, `istioctl`
64
+
65
+ ## Instalacao
66
+
67
+ Sem venv (global):
68
+
69
+ ```bash
70
+ python -m pip install .
71
+ ```
72
+
73
+ Com venv (recomendado para desenvolvimento):
74
+
75
+ ```bash
76
+ python -m venv .venv
77
+ source .venv/bin/activate
78
+ python -m pip install -e .
79
+ ```
80
+
81
+ ## Uso rapido
82
+
83
+ ### Validar Sistema
84
+ ```bash
85
+ # Verifica se o sistema atende pré-requisitos
86
+ sudo raijin-server validate
87
+ ```
88
+
89
+ ### Menu Interativo
90
+ ```bash
91
+ # Menu visual com stautils.py`: Funções utilitárias com retry, timeout e logging.
92
+ - `src/raijin_server/validators.py`: Validações de pré-requisitos e dependências.
93
+ - `src/raijin_server/healthchecks.py`: Health checks pós-instalação.
94
+ - `src/raijin_server/config.py`: Gerenciamento de configuração via arquivo.
95
+ - `src/raijin_server/modules/`: Automações por tópico (hardening, network, essentials, firewall, kubernetes, calico, istio, traefik, kong, minio, prometheus, grafana, loki, harness, velero, kafka).
96
+ - `scripts/`: Espaço para shells e templates auxiliares.
97
+ - `ARCHITECTURE.md`: Visão do desenho técnico.
98
+ - `AUDIT.md`: Relatório completo de auditoria e melhorias.
99
+ - `SECURITY.md`: Como reportar vulnerabilidades
100
+ ### Execução Direta de Módulos
101
+ ```bash
102
+ # Executar módulo específico
103
+ sudo raijin-server kubernetes
104
+
105
+ # Dry-run (simula sem aplicar)
106
+ sudo raijin-server --dry-run kubernetes
107
+
108
+ # Pular validações (não recomendado)
109
+ sudo raijin-server --skip-validation kubernetes
110
+ ```
111
+
112
+ ### Automação via Arquivo de Configuração
113
+ ```bash
114
+ # Gerar template de configuração
115
+ ra✅ Validações de pré-requisitos e health-check por módulo
116
+ - ✅ Gestão automática de dependências entre módulos
117
+ - ✅ Sistema de logging estruturado e persistente
118
+ - ✅ Retry automático e timeouts configuráveis
119
+ - ✅ Configuração via arquivo YAML/JSON
120
+ - ⏳ Provisionar ingress seguro para Grafana/Prometheus/Alertmanager
121
+ - ⏳ Dashboards e alertas opinativos prontos para uso
122
+ - ⏳ Suporte a sealed-secrets/external-secrets para credenciais
123
+ - ⏳ Testes automatizados (pytest) e linters
124
+ - ⏳ Rollback automático em falhas
125
+ - ⏳ Modo de instalação mínima vs completa
126
+
127
+ ## Documentação Adicional
128
+
129
+ - **[AUDIT.md](AUDIT.md)**: Relatório completo de auditoria e melhorias implementadas
130
+ - **[ARCHITECTURE.md](ARCHITECTURE.md)**: Arquitetura técnica do ambiente
131
+ - **[SECURITY.md](SECURITY.md)**: Políticas de segurança e reporte de vulnerabilidades
132
+
133
+ ## Fluxo de Execução Recomendado
134
+
135
+ ```bash
136
+ # 1. Validar sistema
137
+ sudo raijin-server validate
138
+
139
+ # 2. Base do sistema
140
+ sudo raijin-server essentials
141
+ sudo raijin-server hardening
142
+ sudo raijin-server network
143
+ sudo raijin-server firewall
144
+
145
+ # 3. Kubernetes
146
+ sudo raijin-server kubernetes
147
+ sudo raijin-server calico
148
+
149
+ # 4. Ingress (escolha um)
150
+ sudo raijin-server traefik
151
+ # OU
152
+ sudo raijin-server kong
153
+
154
+ # 5. Observabilidade
155
+ sudo raijin-server prometheus
156
+ sudo raijin-server grafana
157
+ sudo raijin-server loki
158
+
159
+ # 6. Storage e Mensageria (opcional)
160
+ sudo raijin-server minio
161
+ sudo raijin-server kafka
162
+
163
+ # 7. Backup
164
+ sudo raijin-server velero
165
+
166
+ # 8. Service Mesh (opcional)
167
+ sudo raijin-server istio
168
+ ```
169
+ # Executar com configuração
170
+ sudo raijin-server --config production.yaml kubernetes
171
+ ```
172
+
173
+ ### Comandos Úteis
174
+ ```bash
175
+ # Versão
176
+ raijin-server version
177
+
178
+ # Monitorar logs
179
+ tail -f /var/log/raijin-server/raijin-server.log
180
+ ```
181
+
182
+ ## Estrutura
183
+
184
+ - `src/raijin_server/cli.py`: CLI principal com Typer, banner e `--dry-run`.
185
+ - `src/raijin_server/modules/`: automacoes por topico (hardening, network, essentials, firewall, kubernetes, calico, istio, traefik, kong, minio, prometheus, grafana, loki, harness, velero, kafka).
186
+ - `scripts/`: espaco para shells e templates.
187
+ - `ARCHITECTURE.md`: visao do desenho atual.
188
+ - `SECURITY.md`: como reportar e pensar seguranca.
189
+
190
+ ## Modulos disponiveis
191
+
192
+ - `hardening`: fail2ban, unattended-upgrades, sysctl.
193
+ - `essentials`: pacotes base (curl, git, jq, etc.) e NTP.
194
+ - `network`: Netplan com IP fixo e DNS.
195
+ - `firewall`: UFW com regras para SSH/HTTP/HTTPS/K8s.
196
+ - `kubernetes`: kubeadm init, containerd SystemdCgroup, kubeconfig.
197
+ - `calico`: CNI Calico com CIDR custom e policy default-deny.
198
+ - `istio`: istioctl install (perfil raijin) e injeção automática.
199
+ - `traefik`: IngressController com TLS/ACME.
200
+ - `kong`: Ingress/Gateway com Helm.
201
+ - `minio`: armazenamento S3 compatível via Helm.
202
+ - `prometheus`, `grafana`, `loki`: observabilidade, dashboards e persistencia.
203
+ - `harness`: delegate Helm com parametros interativos.
204
+ - `velero`: backup/restore com schedule.
205
+ - `kafka`: deploy Bitnami via OCI.
206
+
207
+ ## Roadmap basico
208
+
209
+ - Adicionar validacoes de pre-requisitos e health-check por modulo.
210
+ - Provisionar ingress seguro para Grafana/Prometheus/Alertmanager.
211
+ - Dashboards e alertas opinativos prontos para uso.
212
+ - Suporte a sealed-secrets/external-secrets para credenciais.
213
+ - Testes automatizados (pytest) e linters.
214
+
215
+ ## Proximos passos sugeridos
216
+
217
+ - Substituir os stubs por comandos reais (apt, ufw, helm, kubectl, etc.).
218
+ - Adicionar validacoes e testes (por exemplo, pytest + testcontainers).
219
+ - Empacotar scripts auxiliares em `scripts/` e referencia-los nos modulos.
@@ -0,0 +1,32 @@
1
+ raijin_server/__init__.py,sha256=JtoND-o0nm6bupzu-VJPw5itxg6wM-OlvlNI1RNU4Ao,94
2
+ raijin_server/cli.py,sha256=WMPxcVqbedP-HEpdflV9nqsVr5UytZT6TuZIu9uvuR0,14448
3
+ raijin_server/config.py,sha256=Dta2CS1d6RgNiQ84P6dTXk98boFrjzuvhs_fCdlm0I4,4810
4
+ raijin_server/healthchecks.py,sha256=IA7HOvDnN9Qhq8q26eAnWXeiIj0VpEOJGDIU4Qq9DQs,9879
5
+ raijin_server/utils.py,sha256=XQJxyzo5Edxtapf-n5SSpEmJvkkfrE7p8VZcWyapll8,7477
6
+ raijin_server/validators.py,sha256=z7CIMzDH6Aczvqz7Mb8ICzEud6KTsh7_2Q_pP6wDQkc,7691
7
+ raijin_server/modules/__init__.py,sha256=uQkNtU7rmYAKBrAlrVQGySuoSBW68lTmKd5YaLl2Zn0,603
8
+ raijin_server/modules/bootstrap.py,sha256=pMgtNb9a6wPFK7L16kQoQ-v1oB8-l7C9lrEZ6IqDtm4,6723
9
+ raijin_server/modules/calico.py,sha256=mWbmFixkebdDK0cIHAg-WR2i8zBHA49Nr_pm7dbeYOQ,1281
10
+ raijin_server/modules/essentials.py,sha256=2xUXCyCQtFGd2DnCKV81N1R6bEJqH8zaet8mLovtQ1I,689
11
+ raijin_server/modules/firewall.py,sha256=h6AISqiZeTinVT7BjmQIS872qRAFZJLg7meqlth3cfw,757
12
+ raijin_server/modules/full_install.py,sha256=vN4H46Oyt_MAGMrO_AzcMNtRaJK3IQcSTRgs52gU0zc,4237
13
+ raijin_server/modules/grafana.py,sha256=zxYpWBM-fD8vTgoJ2Hmb9P66wz_JuiidO6_cGK3jG30,1809
14
+ raijin_server/modules/hardening.py,sha256=4hz3ifkMhPlXa2n7gPxN0gitQgzALZ-073vuU3LM4RI,1616
15
+ raijin_server/modules/harness.py,sha256=dhZ89YIhlkuxiRU1deN6wXVWnXm0xeI03PwYf_qgfak,1527
16
+ raijin_server/modules/istio.py,sha256=761FOGEzEXWlTLYApQxUWY8l4cnEbnIXbIHK3itk_AQ,522
17
+ raijin_server/modules/kafka.py,sha256=bp8k_IhuAIO6dL0IpK1UxxLZoGih6nJp0ZnzwmiZEj8,950
18
+ raijin_server/modules/kong.py,sha256=2EZKYBmBhm_7Nduw9PWrvrekp0VCxQbc2gElpAJqKfg,491
19
+ raijin_server/modules/kubernetes.py,sha256=B_J2mHLjMNglksnZk08HSK3z55kNytuq5sVBbjAXbLY,6846
20
+ raijin_server/modules/loki.py,sha256=erwFfSiSFOv-Ul3nFdrI2RElPYuqqBPBBa_MJAwyLys,676
21
+ raijin_server/modules/minio.py,sha256=BVvsEaJlJUV92_ep7pKsBhSYPjWZrDOB3J6XAWYAHYg,486
22
+ raijin_server/modules/network.py,sha256=aGHAOMfjhk4HhNRy50fAvU-Gseabsgh0t7xLfSK2tJ0,1651
23
+ raijin_server/modules/prometheus.py,sha256=Et-Tj6LrM7WDyoYRSY464E67TrEHbRe2G8T8obagC48,1066
24
+ raijin_server/modules/traefik.py,sha256=iA_ke9w7DSFMB5a6VUuNrWRF1kCeJRBRWqMwE9ER_NQ,1413
25
+ raijin_server/modules/velero.py,sha256=_CV0QQnWr5L-CWXDOiD9Ef4J7GaQT-s9yNBwqp_FLOY,1395
26
+ raijin_server/modules/vpn.py,sha256=uUmto0HSovjwR_6DtRi7dDtZDuFvzb9xiM7uZMKAJzA,6127
27
+ raijin_server-0.1.0.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
28
+ raijin_server-0.1.0.dist-info/METADATA,sha256=-7O6WoyOjUFSIq0fN9An1yygk6g_rpPaNjEG4r7VFVE,7386
29
+ raijin_server-0.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
30
+ raijin_server-0.1.0.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
31
+ raijin_server-0.1.0.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
32
+ raijin_server-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ raijin-server = raijin_server.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rafael Luis da Costa Coelho
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ raijin_server