OrbitLab 🛰️
Orbit Lab es un motor avanzado para la ejecución segura de estructuras .dill en Python. Integra validación estructural, ejecución dinámica de funciones y clases, transformación del payload mediante mutaciones encadenadas, cacheo inteligente, cifrado híbrido (RSA + AES), firma digital, y un sistema de almacenamiento con versionado y rollback automático.
🚀 Características principales
- ✅ Runner dinámico para ejecutar funciones, clases o scripts desde
.dill. - 🔧 Sistema de mutadores encadenables para transformar payloads fácilmente.
- 🧠 Validador estructural extensible para asegurar integridad del payload.
- 🛡️ Cifrado híbrido (RSA + AES) con firmas digitales para máxima seguridad.
- 🧬 Almacenamiento versiónado vía
DynamicDillStorecon rollback. - ♻️ Cacheo inteligente basado en hash para acelerar cargas repetidas.
📦 Estructura del Proyecto
📦orbit/
├── .gitignore
├── LICENSE
├── MANIFEST.in
├── README.md
├── orbitlab/
│ ├── __init__.py
│ ├── adapters/
│ │ ├── __init__.py
│ │ ├── base.py
│ │ └── security.py
│ └── core/
│ ├── __init__.py
│ ├── cache.py
│ ├── config.py
│ ├── crypto.py
│ ├── dynamic_store.py
│ ├── logger.py
│ ├── mutator.py
│ ├── registry.py
│ ├── runner.py
│ ├── utils.py
│ └── validator.py
└── pyproject.toml
🧩 Componentes
| Módulo | Descripción |
|---|---|
orbitlab.core.runner |
Ejecuta .dill como scripts, funciones o clases. |
orbitlab.core.mutator |
Registra y aplica transformaciones al payload. |
orbitlab.core.validator |
Valida estructura del .dill antes de ejecutar. |
orbitlab.core.crypto |
Firma digital y cifrado híbrido. |
orbitlab.core.dynamic_store |
Almacenamiento tipo base de datos con rollback/versionado. |
orbitlab.core.cache |
Mecanismo de cacheo basado en hash. |
orbitlab.core.registry |
Registro de versiones .dill con metadatos como autor, hash, timestamp y etiquetas. |
orbitlab.core.validator |
Valida firmas, claves mínimas del payload, y soporta validadores externos. |
🔐 Seguridad
- ✍️ Firmas digitales (
.dill.sig) - 📦 Validación automática de integridad
- 🔐 Desencriptado híbrido usando
cross-crypto-py - 🚫 Bloqueo de ejecución si el archivo fue alterado
🧩 Ejemplos de uso con OrbitRunner
Ejemplo 1: Uso de OrbitRunner y firma
import dill
import os
from pathlib import Path
from orbitlab.core.crypto import firmar_dill
from orbitlab.core.runner import OrbitRunner
print("🚀 Test 1: Ejecución de función serializada con OrbitRunner")
# Directorio específico para este test
base = Path("test1")
base.mkdir(exist_ok=True)
ruta = base / "mi_modelo.dill"
def hola_mundo():
return "👋 Hola desde OrbitRunner"
payload = {
"payload": {
"function": hola_mundo,
"folders": [],
"archivos": [],
"code": "",
}
}
with ruta.open("wb") as f:
dill.dump(payload, f)
firmar_dill(ruta)
runner = OrbitRunner(str(ruta))
runner.run()
print("✅ Test 1 finalizado con ejecución directa exitosa")
print("Archivos en", base, ":", os.listdir(base))
Ejemplo 2: Una clase y mutaciones
import dill
import os
from pathlib import Path
from orbitlab.core.crypto import firmar_dill
from orbitlab.core.runner import OrbitRunner
from orbitlab.core import global_mutator
print("🔧 Test 2: Clase + método + mutaciones encadenadas + creación de carpetas")
# Directorio específico para este test
base = Path("test2")
base.mkdir(exist_ok=True)
ruta = base / "mi_modelo_mutado.dill"
carpeta_obj = base / "saludos"
archivo_obj = base / "bienvenida.txt"
@global_mutator.register("inject_data")
def inject_data(payload):
print("🔧 inject_data aplicado")
payload.setdefault("data", {})["quien"] = "mutado"
return payload
@global_mutator.register("normalize_data")
def normalize_data(payload):
print("🔧 normalize_data aplicado")
if "quien" in payload.get("data", {}):
payload["data"]["quien"] = payload["data"]["quien"].capitalize()
return payload
codigo = """
class Saludo:
def __init__(self, data):
self.quien = data.get("quien", "nadie")
def saludo(self):
return f"🌟 Hola desde mutación, {self.quien}!"
"""
payload = {
"payload": {
"code": codigo,
"data": {},
"expose": {
"class_name": "Saludo",
"methods": [{"name": "saludo"}]
},
# Ahora pedimos crear carpeta y archivo en base/
"folders": [str(carpeta_obj)],
"archivos": [
{"path": str(archivo_obj), "content": "¡Hola!"}
],
}
}
with ruta.open("wb") as f:
dill.dump(payload, f)
firmar_dill(ruta)
runner = OrbitRunner(
str(ruta),
mutation_filter=["inject_data", "normalize_data"]
)
runner.run("saludo")
print("✅ Test 2 finalizado con mutaciones y creación de:", os.listdir(base))
print("· Carpeta 'saludos' existe?", carpeta_obj.is_dir())
print("· Archivo 'bienvenida.txt' existe?", archivo_obj.is_file())
Ejemplo 3: Uso con DynamicDillStore 🧠
import os
from pathlib import Path
from orbitlab.core.dynamic_store import DynamicDillStore
print("📦 Test 3: DynamicDillStore commit y rollback")
# Definimos un directorio y fichero de entrada
base_dir = Path("test3_commit_rollback/entrada")
base_dir.mkdir(parents=True, exist_ok=True)
path = base_dir / "data.dill"
# Crear store (auto_save creará data.dill)
store = DynamicDillStore(str(path), auto_save=True)
print("Store inicializado, existe?", path.exists())
# Setear y commitear valores iniciales
store.set("params", {"a": 1, "b": 2})
print("📝 Valores iniciales guardados:", store.get("params"))
store.commit("params")
versions_dir = Path(str(path) + ".versions")
print("🔐 Commit realizado, versiones:", os.listdir(versions_dir))
# Hacemos un cambio y otro commit
store.set("params", {"a": 2, "b": 3})
store.commit("params")
print("🔐 Segundo commit, versiones:", os.listdir(versions_dir))
# Listar history y rollback a la primera versión
history = store.history("params")
print("🕒 History timestamps:", history)
first_ts = history[0]
store.rollback("params", first_ts)
print("↩️ Rollback a", first_ts, "->", store.get("params"))
📁 Formato esperado del .dill
{
"payload": {
"code": "...",
"function": ...,
"data": {...},
"expose": {
"class_name": "MyClass",
"methods": [{"name": "do"}]
},
"folders": [],
"archivos": []
}
}
⚙️ Requisitos
- Python 3.10+
dill,filelock,cross-crypto-py,pydantic-settings
🪪 Licencia
BSD 3-Clause License © 2025 Jose Fabian Soltero Escobar
Metadata
Release files for orbitlab 0.1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| orbitlab-0.1.7.tar.gz | 25.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| orbitlab-0.1.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 56.5 kB
Release files / orbitlab-0.1.7.tar.gz
| Download URL | orbitlab-0.1.7.tar.gz |
|---|---|
| Size | 25.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4385db7109e2681cbe0b5a7b7bda1232ff853580b45931eea0465da3d21aed28
|
|
BLAKE2b-256 checksum How to use checksums |
e5569bf20f5453f61dfe1d7635ae0a3afa8d026cab35c8444a317364471668c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.12
|
Release files / orbitlab-0.1.7-py3-none-any.whl
| Download URL | orbitlab-0.1.7-py3-none-any.whl |
|---|---|
| Size | 31.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ebc13e8b0212494243c0de4d38a78139ca642f90278a99ce7ebe57e121c20b57
|
|
BLAKE2b-256 checksum How to use checksums |
57d0a7d80337a812ede23551f946fd3e11a7c363b843e969bfb25f5bb88f4bbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.12
|
Security for orbitlab 0.1.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.